代码为天勤数据结构高分笔记查找一章 :二叉排序树。
其下为具体的插入,删除,查找,遍历的实现与运行
#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;
}