二叉排序树
1.实验目的
1、掌握顺序表的查找方法,尤其是二分法查找,并能给予实现
2、掌握基于链表的查找方法,并能给予实现
3、掌握二叉排序树的建立及查找算法,并能给出实现
2.实验内容
1、排序二叉树的建立
2、判定二叉树是否为BST
3、在二叉排序树中查找元素x
4、打印操作
5、删除值为x的结点
3.设计思路
先创建向二叉排序树钟插入元素的函数,策略类似于用前序遍历建树,然后通过while循环进行建树,判断是否为BST可以中序遍历,p>pre 判别,假设中序呈升序,删除一度结点即以孙代子,最后用中序遍历进行打印操作。
4.实验代码
#include <stdio.h>
#include <stdlib.h>
typedef struct k
{
int data;
struct k *l,*r;
}btree;
btree* insertBSTree(btree *t,int x)//向二叉排序树t中插入元素x,插入后依旧为二叉排序树
{
btree *pre,*p,*q;
q=(btree*)malloc(sizeof(btree));//造结点
q->data=x;q->l=NULL;q->r=NULL;//给q的三个域赋初值
if(t==NULL)return q;//如果为空树,直接返回结点q
p=t;
while(p!=NULL)//查找插入位置
{
pre=p;
if(x<=pre->data)p=p->l;
else p=p->r;
}
if(x<=pre->data)pre->l=q;
else pre->r=q;
return t;
}
btree* creat()//基于插入操作建树
{
btree *t;
int x;
printf("请输入一组数据(以-1作为结束):");
scanf("%d",&x);
t=NULL;
while(x!=-1)
{
t=insertBSTree(t,x);
scanf("%d",&x);
}
return t;
}
void inOrder(btree *t)
{
if(t==NULL)return;
inOrder(t->l);
printf("%d ",t->data);
inOrder(t->r);
}
btree* find(btree *t,int x)//在二叉排序树中查找元素x,若找到,则返回指向该节点的指针
{
if(t==NULL)return NULL;
if(t->data==x) return t;
if(x<t->data)return find(t->l,x);
else return find(t->r,x);
}
btree* find1(btree *t,int x)//在二叉排序树中查找元素x(不是根),若找到,则返回指向该节点的双亲
{
btree *pre=NULL,*p;
if(t==NULL)return NULL;
p=t;
while(p!=NULL)//查找元素x结点位置
{
pre=p;
if(x<p->data)p=p->l;
else p=p->r;
if(p->data==x)return pre;
}
return NULL;//没找到的情况
}
int isBST(btree *t)//判定二叉树是否为BST
{
static btree *pre=NULL;
if (t==NULL) return 1;
if(isBST(t->l)==0) return 0;//判断左子树是否为二叉排序树
if( pre!=NULL && pre->data > t->data) return 0;
pre=t;
return isBST(t->r);//判断右子树是否为二叉排序树
}
void del_1_node(btree *t,int x)//删除值为x的结点(1度结点,且为t的孩子,不清楚是左孩子还是右孩子)
{
btree *q,*pre;
if(t==NULL)return ;
q=find(t,x);
pre=find1(t,x);//pre为q的双亲结点
if(q==pre->l)//如果为左孩子
{
if(q->l!=NULL)pre->l=q->l;//将q的左孩子交给pre
else pre->l=q->r;//将q的右孩子交给pre
}
if(q==pre->r)//如果为右孩子
{
if(q->l!=NULL)pre->r=q->l;
else pre->r=q->r;
}
free(q);
}
int main()
{
btree *t,*q;
int x,a;
t=creat();
printf("t=");
inOrder(t);
a=isBST(t);
if(a==1)printf("\nt是二叉排序树");
else printf("t不是二叉排序树");
printf("\n请输入要查找的值:");
scanf("%d",&x);
q=find(t,x);
if(q!=NULL)printf("找到了:%d",q->data);
else printf("没找到!");
printf("\n删除一度节点3后:");
del_1_node(t,3);
printf("\nt=");
inOrder(t);
printf("\n删除一度节点5后:");
del_1_node(t,5);
printf("\nt=");
inOrder(t);
printf("\n删除一度节点6后:");
del_1_node(t,6);
printf("\nt=");
inOrder(t);
return 0;
}
5.运行结果
![](https://img-blog.csdnimg.cn/img_convert/842994ed240b815d46f884c62369d06a.jpeg)
6.实验总结(含心得体会)
通过本次实验,我学习了排序二叉树的建立、判定二叉树是否为BST、在二叉排序树中查找元素x、打印操作、删除值为x的结点等操作,在实现这些操作的过程中,我认识到自己存在的一些不足之处,在以后的学习中我会加以改正。