二叉搜索树的非递归创建和搜索

#include "stdio.h"
typedef struct node
{
	int data ;
	node*lChild ;
	node*rChild ;
}TreeNode  ;
void Insert(TreeNode**root,int data)  //向二叉查找树中插入元素  采用非递归思想
{
	 TreeNode * p=*root ;//获得根结点
	 TreeNode*q=new TreeNode ;//分配一个要插入的新节点
	 q->lChild=q->rChild=NULL ; //新分配节点的左节点=右节点等于NULL
	 q->data=data ;  //保存数据到节点
     TreeNode *parent =p ; //用于保存父节点
	 while(p!=NULL)  //循环搜索节点
	 {
       parent=p ;  //首先parent指向root节点
	   if(p->data>data)   //如果节点数据大于当前节点
		   p=p->lChild  ;//如果插入数据小于 节点数据那么指向左节点  我么最终是要找到一个NULL节点
	   else
		   p=p->rChild  ;
	 }
	 //如果因为parent总是指向NULL节点的父节点 ,所以parent指向的节点不会为空,如果为空那么说明该树是一颗空的树。
	 if(parent==NULL)
		 *root=q ; //将分配的节点作为根节点
	 else if(parent->data>data)
		 parent->lChild=q ;   //<root左插
	 else
		 parent->rChild=q ;  //>root右插
} 

void InOrder(TreeNode*root)
{
	 if(root!=NULL)
	 {
	  InOrder(root->lChild) ;
	  printf("%d",root->data) ;
	  InOrder(root->rChild) ;
	 }
}
bool   Find(TreeNode*root,int fData)   //非递归方法查询
{
	if(root==NULL)
		return false ;  //搜索树为空返回false
	while(root!=NULL)
	{
		if(root->data==fData)
			return true ;
		if(root->data>fData)
			root=root->lChild ;
		else
			root=root->rChild ;
	}

   return false  ;
}

int main(int argc,char*argv[])
{

    TreeNode *root=NULL;  //如果根节点指针在局部那么一定要初始化NULL否则程序崩溃 ,如果我们的指针是在全局定义的可以不初始化NULL全局变量放在静态存储区
	int a[]={2,3,6,8,0,9,3,1,5,7} ;
	for(int i=0;i<10;i++)
	Insert(&root,a[i]) ;
	InOrder(root) ;
	printf("\n") ;
	if(Find(root,0))
		printf("数据0找到\n") ;
	else
		printf("没有0数据\n") ;

	return 1 ;
}

二叉搜索树又称二叉查找树  , 他有这样的特点,根节点 的数据比他的左子树大.  比右节点小 ,中序遍历可以得到一棵升序的 序列 。

二叉搜索树可以采用递归和非递归方式建立 ,由于递归消耗内存较大 ,所以采用非递归方式 。

 

 

时间: 2024-10-25 17:53:42

二叉搜索树的非递归创建和搜索的相关文章

九度题目1009:二叉搜索树

题目1009:二叉搜索树 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4308 解决:1919 题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树. 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树. 输出: 如果序列相同则输出YES

二叉搜索树与树的遍历非递归练习

复习了二叉搜索树的实现,包括插入.查找和删除操作,顺便做了下二叉树的三种遍历操作.全部操作采用非递归方式.   #include<iostream>   #include<stack>   using namespace std;     typedef int T;   // 值类型      // 节点定义    struct node {       T val;       node *left,*right;       node(const T& val):va

Java创建二叉搜索树,实现搜索,插入,删除操作

Java实现的二叉搜索树,并实现对该树的搜索,插入,删除操作(合并删除,复制删除) 首先我们要有一个编码的思路,大致如下: 1.查找:根据二叉搜索树的数据特点,我们可以根据节点的值得比较来实现查找,查找值大于当前节点时向右走,反之向左走! 2.插入:我们应该知道,插入的全部都是叶子节点,所以我们就需要找到要进行插入的叶子节点的位置,插入的思路与查找的思路一致. 3.删除: 1)合并删除:一般来说会遇到以下几种情况,被删节点有左子树没右子树,此时要让当前节点的父节点指向当前节点的左子树:当被删节点

【算法学习】AVL平衡二叉搜索树原理及各项操作编程实现(C++)

AVLTree即(Adelson-Velskii-Landis Tree),是加了额外条件的二叉搜索树.其平衡条件的建立是为了确保整棵树的深度为O(nLogn).平衡条件是任何节点的左右子树的高度相差不超过1.   在下面的代码中,编程实现了AVL树的建立.查找.插入.删除.遍历等操作.采用C++类封装. AVL树中比较复杂的操作时插入和删除操作.在这里对插入和删除操作进行讲解.   AVL树的插入操作 向AVL树中插入元素可能会导致树失去平衡.但是,我们只需要调整插入点至根节点的路径上不满足平

纸上谈兵: 树, 二叉树, 二叉搜索树[转]

树的特征和定义 树(Tree)是元素的集合.我们先以比较直观的方式介绍树.下面的数据结构是一个树: 树有多个节点(node),用以储存元素.某些节点之间存在一定的关系,用连线表示,连线称为边(edge).边的上端节点称为父节点,下端称为子节点.树像是一个不断分叉的树根. 每个节点可以有多个子节点(children),而该节点是相应子节点的父节点(parent).比如说,3,5是6的子节点,6是3,5的父节点:1,8,7是3的子节点, 3是1,8,7的父节点.树有一个没有父节点的节点,称为根节点(

二叉搜索树(Binary Search Tree)--C语言描述(转)

图解二叉搜索树概念 二叉树呢,其实就是链表的一个二维形式,而二叉搜索树,就是一种特殊的二叉树,这种二叉树有个特点:对任意节点而言,左孩子(当然了,存在的话)的值总是小于本身,而右孩子(存在的话)的值总是大于本身. 下面来介绍在此种二叉树结构上的查找,插入,删除算法思路. 查找:因为这种结构就是为了来方便查找的,所以查找其中的某个值很容易,从根开始,小的往左找,大的往右找,不大不小的就是这个节点了: 代码很简单,这里就不写了. 插入:插入一样的道理,从根开始,小的往左,大的往右,直到叶子,就插入.

剑指offer系列之二十五:二叉搜索树与双向链表

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 由于二叉搜索树的中序遍历就是排序的,如果是构造单链表,只需要一次中序遍历就可以了,但现在需要构造双链表,也就是在中序遍历的过程中需要设置每个节点的left与right指针,现在问题是如何设置这两个指针?二叉搜索树有一个特点,就是根节点的左子树上所有节点都比根节点的值小,而右子树上的所有节点的值都比根节点的值大,利用这个性质,当遍历根节点的左孩子的时候,可以继续把其当做左子

二叉搜索树的插入与删除(详细解析)_C 语言

题目:创建一个类,类中的数据成员时一棵二叉搜索树,对外提供的接口有添加结点和删除结点这两种方法.用户不关注二叉树的情况.要求我们给出这个类的结构以及实现类中的方法. 思路添加结点:添加结点其实很容易,我们只需要找到结点所行对应的位置就可以了,而且没有要求是平衡的二叉搜索树,因此每次添加结点都是在叶子结点上操作,不需要修改二叉搜索树整体的结构.要找出添加节点在二叉搜索树中的位置,可以用一个循环解决.判断插入结点与当前头结点的大小,如果大于头结点则继续搜索右子树,如果小于头结点则继续搜索左子树.直到

纸上谈兵: 树, 二叉树, 二叉搜索树

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   树的特征和定义 树(Tree)是元素的集合.我们先以比较直观的方式介绍树.下面的数据结构是一个树: 树有多个节点(node),用以储存元素.某些节点之间存在一定的关系,用连线表示,连线称为边(edge).边的上端节点称为父节点,下端称为子节点.树像是一个不断分叉的树根. 每个节点可以有多个子节点(children),而该节点是相应子节点的父节点(parent).比如说,3,5