#include <iostream>
#define TRUE 1
#define FALSE 0
using namespace std;
typedef int Status;
typedef struct BtNode
{
int data; //数据域
struct BtNode *lchild,*rchild;
}BtNode,*BTree;
//二叉排序树的查找操作
//参数1:BTree T ,查找操作不修改这个二叉排序树,所以不采用引用方式
//参数2:int key ,要查找的值
//参数3:BTree f ,f指向T的双亲,初始的值为NULL;
//参数4:BTree &p , 若找到,则p用来保存查找到的元素的位置,没找到则p=f,所以采用引用方式带回
/*********************************************************/
Status SerachBST(BTree T , int key ,BTree f, BTree &p)
{
if(!T) //查找不成功
{
p=f;
return FALSE;
}
else if(key == T->data) //查找成功
{
p=T; //p记录下查找到的位置
return TRUE;
}
else if(key < T->data)
return SerachBST(T->lchild,key,T,p); //在左子树继续查找
else
return SerachBST(T->rchild,key,T,p); //在右子树继续查找
}
//二叉排序树插入操作
//当二叉树不存在关键字等于key的数据元素时,插入key并返回TRUE,否则返回FALSE.
//参数1:BiTree &T ,因为插入操作要把最后结果带回来,所以在用引用
//参数2:int key , 要查找到的值,若没有该值,则插入,若有则不再插入
/*********************************************************/
Status InsertBST(BTree &T , int key)
{
BTree p,s;
if(!SerachBST(T ,key ,NULL ,p)) //查找不成功
{
s= new BtNode;
s->data = key;
s->lchild=s->rchild=NULL;
if(!p)
T = s; //插入s为新的根节点
else if(key<p->data)
p->lchild=s; //插入s为左孩子
else
p->rchild=s; //插入s为右孩子
return TRUE;
}
else
return FALSE; //树中已经有关键字相同的结点,不再插入
}
//从二叉排序树中删除结点p,并重接他的左或右子树
/*********************************************************/
Status Delete(BTree &p)
{
BTree q,s; //借助这两个指针
if(p->rchild == NULL) //被删结点的右子树为空,则只需要重接他的左子树
{
q=p;
p=p->lchild;
delete q;
}
else if(p->lchild == NULL) //被删结点的左子树为空,则只需要重接他的右子树
{
q=p;
p=p->rchild;
delete q;
}
else//被删结点的左右子树均不为空,可选其左子树中最大的(直接前驱)补上来,或者其右子树中的最小的补上来(直接后继)
{ //这里采用的是选其左子树中最大的(直接前驱)补上来,然后在小调整
q=p;
s=p->lchild;
while(s->rchild) //转左,然后向右到尽头(找到待删结点的前驱)
{
q=s;
s=s->rchild;
}
p->data=s->data; //此时的s是指向被删结点的直接前驱
if(q != p)
q->rchild = s->lchild; //重接q的右子树
else
q->lchild = s->lchild; //重接q的左子树
delete s;
}
return TRUE;
}
//二叉书排序树的删除操作(先找到后删除)
//若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素结点
//并返回TRUE,否则返回FALSE
/*********************************************************/
Status DeleteBST(BTree &T , int key)
{
if(!T) //表明不存在关键字等于key的数据元素
return FALSE;
else
{
if(key == T->data) //找到关键字等于key的数据元素
return Delete(T);
else if(key < T->data)
return DeleteBST(T->lchild ,key);
else
return DeleteBST(T->rchild ,key);
}
}
int main()
{
BTree T = NULL;
BTree p ,q;
BTree f = NULL;
int a[10]={62,88,58,47,35,73,51,99,37,93};
for(int i=0;i<10;i++)
InsertBST(T,a[i]);
SerachBST(T,93,f,p);
cout<<"找到了:"<<p->data<<endl;
DeleteBST(T,93); //删除93这个结点
int result = SerachBST(T,93,f,q);
if(result == TRUE) //表示找到93
cout<<q->data<<endl;
else //表示没找到
cout<<"没找到!!!";
return 0;
}
C++数据结构-二叉排序树的查找、创建和删除
猜你喜欢
转载自blog.csdn.net/weixin_43323201/article/details/84894714
今日推荐
周排行