欢迎进入@shuai:二叉排序树3;
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
#include<stdio.h>
#include<stdlib.h>
#define size 100
typedef struct tree{
int data;
struct tree *l,*r;
}tree;
tree* isno(){
int n;
tree *bt;
bt=(tree*)malloc(sizeof(tree));
printf("请输入根节点(0表示空)");
scanf("%d",&n);
if(n==0){
printf("次树为空");
exit(0);
}
else{
bt->data=n;
bt->l=0;
bt->r=0;
}
return bt;
}
creat(tree *bt){
int n;
tree *node;
node=(tree*)malloc(sizeof(tree));
printf("请输入节点为%d的左儿子",bt->data);
scanf("%d",&n);
if(n!=0){
node->data=n;
node->l=0;
node->r=0;
bt->l=node;
creat(bt->l);
}
printf("请输入节点为%d的右儿子",bt->data);
scanf("%d",&n);
if(n!=0){
node->data=n;
node->l=0;
node->r=0;
bt->r=node;
creat(bt->r);
}
}
print(tree *bt){
tree **q;
tree*p;
q=(tree**)malloc(size*sizeof(tree*));
int front=0,rear=0;
rear=(rear+1)%size;
q[rear]=bt;
while(front!=rear){
front=(front+1)%size;
p=q[front];
printf("%d ",p->data);
if(p->l){
rear=(rear+1)%size;
q[rear]=p->l;
}
if(p->r){
rear=(rear+1)%size;
q[rear]=p->r;
}
}
free(q);
}
tree* insert(int m,tree *bt){
if(!bt){
bt=(tree*)malloc(sizeof(tree));
bt->data=m;
bt->l=0;
bt->r=0;
}
else {
if(m>bt->data){
bt->r=insert(m,bt->r);
}
if(m<bt->data){
bt->l=insert(m,bt->l);
}
}
return bt;
}
tree* findmin(tree *bt)
{
if(bt->l){
findmin(bt->l);
}
else{
return bt;
}
}
tree* delet(int k,tree *bt){
tree *tem;
tem=(tree*)malloc(sizeof(tree));
if(!bt){
printf("未找到%d",k);
}
else if(k<bt->data){
bt->l=delet(k,bt->l);
}
else if(k>bt->data){
bt->r=delet(k,bt->r);
}
else
if(bt->l&&bt->r){
tem=findmin(bt->r);
bt->data=tem->data;
bt->r=delet(bt->data,bt->r);
}
else{
tem=bt;
if(!bt->l){
bt=bt->r;
}
else if(!bt->r){
bt=bt->l;
}
free(tem);
}
return bt;
}
main()
{
tree *bt;
bt=isno();
creat(bt);
print(bt);
system("pause");
system("cls");
printf("请输入需要插入树中的数");
int m;
scanf("%d",&m);
insert(m,bt);
print(bt);
system("pause");
system("cls");
printf("请输入需要删除的数");
int k;
scanf("%d",&k);
delet(k,bt);
print(bt);
}
1.二叉搜索树操作有创造根节点,创造其他节点,遍历,插入节点,删除节点,输出二叉树等(上述带码只有层序输出,先序后序中序输出请看本弱弱另一篇关于二叉树的文章
https://mp.youkuaiyun.com/mdeditor/89646812#
2.注意输入时应该以二叉排序树的规则输入(它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值),,否则函数功能不能实现呦。
3.本人感觉删除是这里最难的,介绍下删除,只有叶节点时直接删除就好,记得删除后父节点置为0呦,只有左儿子或右儿子时将指向自己的指针指向左儿子或右儿子即可。
3.当左右儿子都存在时我们将它转化为只有左儿子或只有右儿子的节点来处理,在他的右枝中照最小值来代替他(右枝的最小值一定只有右儿子或没有儿子),然后删除他的这个右枝中最小儿子就ok(有点绕,还是看代码理解理解吧 QAQ)
)
4… 加油努力鸭!QAQ “ ---- “
如果不懂,推荐看本弱弱另外两篇
二叉排序树2,https://blog.youkuaiyun.com/weixin_44836745/article/details/89646812
二叉排序树1,https://blog.youkuaiyun.com/weixin_44836745/article/details/89609462
发现错误,疑惑不解,联系作者:1939096278@qq.com
欢迎联系呦 -------- QAQ ---------;