二叉排序树BST的插入、查找实现(递归和非递归)

#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct BiTNode{
	ElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

//递归实现 
bool BST_insert(BiTree T,ElemType key){
	if(T->data==-1){//第一个结点还未插入新元素 
		T->data=key;
		return true; 
	}
	if(T->data==key){//递归结束条件
		return false;
	}
	//递归终止时找到插入位置再分配空间 
	else if(key<T->data&&T->lchild==NULL){ //递归结束条件 
		T->lchild = (BiTNode *)malloc(sizeof(BiTNode));
		T->lchild->data = key;
		T->lchild->lchild = T->lchild->rchild = NULL;
		return true; 
	}
	else if(key>T->data&&T->rchild==NULL){//递归结束条件
		T->rchild = (BiTNode *)malloc(sizeof(BiTNode));
		T->rchild->data = key;
		T->rchild->lchild= T->rchild->rchild = NULL;
		return true;
	}
	//往下层递归 
	else if(key<T->lchild)//此时T->lchild一定存在 
		BST_insert(T->lchild,key);
	else if(key>T->rchild)//此时T->rchild一定存在 
		BST_insert(T->rchild,key);

}

bool BST_insert2(BiTree T,ElemType key){
	if(T->data==-1){//第一个结点还未插入新元素 
		T->data=key;
		return true;
	}
	BiTNode *p=T;//p用来遍历二叉树 
	while(p!=NULL){//大前提保证指针不断 这种方法有问题,但分指树 
		if(key==p->data){
			return false;
		}		
		if(key < p->data){
			if(p->lchild==NULL){//找到插入位置 
				p->lchild = (BiTNode *)malloc(sizeof(BiTNode));
				p->lchild->data = key;
				p->lchild->lchild = p->lchild->rchild = NULL;
				return true; 
			}
			p = p->lchild;//保证了p->lchild存在 
		}
			
		else if(key>p->data){
			if(p->rchild==NULL){//找到插入位置 
				p->rchild = (BiTNode *)malloc(sizeof(BiTNode));
				p->rchild->data = key;
				p->rchild->lchild= p->rchild->rchild = NULL;
				return true;
			} 
			p = p->rchild;
		}		
	}//while	
} 


//查找非递归实现 
BiTNode *BST_Find(BiTree T,ElemType key){
	//非递归
	/*while(T!=NULL){
		if(T->data==key)
			return T;
		else if(T->data<key)
			T = T->lchild;
		else
			T = T->rchild;
	} 
	return T;//查找失败返回空 */
	while(T!=NULL&&key!=T->data){
		if(T->data<key)
			T = T->rchild;
		else if(T->data>key)
			T = T->lchild;
	}
	return T;
}
//递归实现
BiTNode *BST_Find2(BiTree FindT,ElemType key){
	if(FindT==NULL)
		return FindT;
	else if(FindT->data==key)
		return FindT;
	else if(FindT->data>key)
		BST_Find2(FindT->lchild,key);
	else
		BST_Find2(FindT->rchild,key);
} 
void Creat_BST(BiTree *T){
	*T = (BiTree)malloc(sizeof(BiTNode));//建立头结点便于操作 	 
}
void out_put(BiTree T){
	if(T!=NULL){//中序遍历得到递增序列 
		out_put(T->lchild);
		printf("%d,",T->data);
		out_put(T->rchild);
	}


}
void main(){
	BiTree T;
	int str[]={53,17,65,87,23,9,45,78};
	int n=sizeof(str)/sizeof(int);
	Creat_BST(&T);//使用创建函数是为了先创建一个结点是指针有明确指向,便于后面的指针传递处理
	T->data=-1;//可以给第一个结点赋一个特殊值,使插入函数区分第一个结点是否已插入数据  
	T->lchild = T->rchild=NULL;
	for(int i=0;i<n;i++){
		BST_insert(T,str[i]);//第一个结点已存在 ,可
	}

}


  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值