//Binary Sort Tree
#include <stdio.h>
#define FALSE 0
#define TRUE 1
#define Status int
typedef int KeyType ;
typedef int ElementType;
typedef struct BiTNode{
ElementType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
int EQ(int a,int b)
{//a>b
if(a==b) return 1;
else return 0;
}
int LT(int a,int b)
{//a<b
if(a<b) return 1;
else return 0;
}
BiTree SearchBST(BiTree T,KeyType key)
{//在根只真么T所指二叉排序树中递归地查找某关键字等于key的数据元素,
//若查找成功,则返回指向该数据元素节点的指针,则返回空指针
if(!T||EQ(key,T->data)) return(T); //查找结束
else if(LT(key,T->data)) return(SearchBST(T->lchild,key)); //在左子树中继续查找
else return(SearchBST(T->rchild,key)); //在右子树中继续查找
}//SearchBST
Status SearchBST_I(BiTree T,KeyType key,BiTree f,BiTree &p)
{//递归查找key,若成功,则指针p指向该数据元素节点,并返回TRUE,否则p指向查找路径上访问的最后一个
//节点,并返回FALSE,指针f指向T的双亲,其初始调用值为NULL
if(!T){p=f;return FALSE;} //查找不成功
else if(EQ(Key,T->data)) {p=T;return TRUE;} //查找成功
else if(LT(key,T->data)) return SearchBST_I(T->lchild,key,T,p); //在左子树中继续查找
else return SearchBST_I(T->rchild,key,T,p); //在右子树中继续查找
}//SearchBST_I
Status InsertBST(BiTree &T,ElementType e)
{//在二叉排序树T中布存在关键字等于e的数据元素时,插入e并返回TRUE
//否则返回FALSE
BiTree s,p;
if(!SearchBST_I(T,e,NULL,p)) //查找不成功
{
s=(BiTree)malloc(sizeof(BiTNode));
s->data=e; e->lchild=e->rchild=NULL;
if(!p) T=s; //树空 则s为根节点
else if(LT(e,T->data)) p->lchild=s; //别插入节点s为左孩子
else p->rchild=s;
return TRUE;
}
else return FALSE;
}//InsertBST
Status DeleteBST(BiTree &T,KeyType Key)
{//若二叉排序树T中存在关键字等于key的数据元素时,则删除该元素节点,
//并返回TRUE,否则返回FALSE
if(!T) return FALSE; //不存在关键字等于key的数据元素
else {
if(EQ(key,T->data)) return Delete(T); //找到关键字等于key的数据元素
else if(LT(key,T->data)) return DeleteBST(T->lchild,key); //在左子树中查找
else return DeleteBST(T->rchild,key);
}
}//DeleteBST
Status Delete(BiTree &p)
{//从二叉排序树中删除节点p,并重接它的左或右节点
BiTree q,s;
if(!p->rchild) //右子树空则只需重接它的左子树
{
q=p;p=p->lchild;free(q);
}
else if(!p->lchild)
{//左子树为空 只需重接它的右子树
q=p; p=p->rchild; free(q);
}
else
{//左右子树均不空
q=p; s=p->lchild;
while(s->rchild){q=s; s=s->rchild;} //转左,然后向右到尽头
p->data=s->data;
if(q!=p) q->rchild=s->lchild; //把S的左子树接到q的右子树上
else q->lchild=s->lchild; //此时q即为被删除的节点,s为p的左子树,把s的左子树接到q的左子树上
}
}//Delete
温习二叉排序树的相关操作
最新推荐文章于 2023-09-20 01:47:34 发布