天勤数据结构高分笔记二叉排序树的实现

代码为天勤数据结构高分笔记查找一章 :二叉排序树。
其下为具体的插入,删除,查找,遍历的实现与运行

#include<stdio.h>
#include<stdlib.h>

//二叉排序树的存储结构 
typedef struct BTNode{
	int key;
	struct BTNode *lchild,*rchild;
}BTNode; 

//查找关键字算法
BTNode* BSTSearch(BTNode *bt,int key){
	if(bt==NULL)
		return NULL;//空指针则返回空,查找不成功
	else{
		if(bt->key==key)
			return bt;//等于根节点,查找成功,返回关键字所在的节点指针 
		else if(bt->key>key)//小于根节点的关键字到左子树查找 
			return BSTSearch(bt->lchild,key);
		else				//大于根节点的关键字到右子树查找 
			return BSTSearch(bt->rchild,key); 
		} 
} 

//删除函数
int Delete(BTNode *&bt){
	BTNode *q,*s;
	//情况1 结点p本身为叶子节点,直接删除即可
	if(!bt->lchild&&!bt->rchild)
		bt=NULL;
	else if(!bt->lchild){//左子树为空,只需用结点p的右子树根代替结点p即可 
		q=bt;
		bt=bt->rchild;
		free(q);
	} 
	else if(!bt->rchild){//右子树为空,只需用结点p的左子树根代替结点p即可 
		q=bt;
		bt=bt->lchild;
		free(q);
	} 
	else{//左右子树都不空,采用第2种方式 
		q=bt;
		s=bt->lchild;
		//遍历,找到结点p的直接前驱
		while(s->rchild){
			q=s;
			s=s->rchild;
		} 
		//直接改变结点p的值
		bt->key=s->key;
		//判断节点p的左子树 s是否有右子树,分两种情况讨论
		if(q!=bt)
			q->rchild=s->lchild;//若有,则在删除直接前驱结点的同时,令前驱的左孩子结点改为q指向结点的孩子结点
		else
			q->lchild=s->lchild;
		free(s);
	}
	return 1;
} 

//删除关键字 成功返回1,失败返回0 
int DeleteBST(BTNode *&bt,int key){
	if(!bt)//不存在关键字等于key的数据元素 
		return 0; 
	else{
		if(key==bt->key){
			Delete(bt);
			return 1;
		}
		else if(bt->key>key)
			return DeleteBST(bt->lchild,key);
		else
			return DeleteBST(bt->rchild,key); 
	} 
} 

//插入关键字算法  成功返回1 失败返回0 
int BSTInsert(BTNode *&bt,int key){	//因为bt要改变,故要使用引用型 
	if(bt==NULL)//当前为空指针说明找到插入位置,创建新节点进行插入
	{
		bt=(BTNode *)malloc(sizeof(BTNode));//创建新节点
		bt->lchild=bt->rchild=NULL;
		bt->key=key;//将待插入关键字存入新节点 
		return 1; 
	}else{//如果结点不空,查找待插入位置 
		if(bt->key==key)//关键字已存在 ,插入失败返回0
			return 0;
		else if(bt->key>key)//小于根节点的关键字到左子树查找
			return BSTInsert(bt->lchild,key);
		 else				//大于根节点的关键字到右子树查找 
		 	return BSTInsert(bt->rchild,key);
	} 
}

//二叉排序树的构建
void CreateBST(BTNode *&bt,int key[],int n){
	bt=NULL;//将树清空
	for(int i=0;i<n;i++)
		BSTInsert(bt,key[i]);	
} 

//先序输出 详细看天勤数据结构142页 
void Order(BTNode *bt){
	if(bt==NULL)
		return ;
	printf("%d  ",bt->key);
	Order(bt->lchild);
	Order(bt->rchild);
} 

int main(){
	int key[]={9,1,2,3,6,5,8};
	BTNode *bt,*temp;
	CreateBST(bt,key,7);//创建二叉排序树 
	Order(bt);
	temp=BSTSearch(bt,5); //查找关键字为5的结点 
	printf("\n%d\n",temp->key);
	DeleteBST(bt,5);//删除关键字5的节点 
	Order(bt);	 
	return 0;
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值