/*二叉树的二叉链表结点结构定义*/
typedef struct BiTNode //结点结构
{
int data; //结点数据
Struct BiTNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;
二、二叉排序树操作算法
1.二叉排序树的查询操作
/*递归查找二叉排序树T中是否存在key,
* 指针f指向T的双亲,其初始调用值为NULL
*若查找成功,则指针p指向该数据元素结点,并返回TRUE;否则指针p指向查找路径上访问的最后一个结点并返回FALSE*/
Status SearchBST(BiTree T,int key,BiTree f,BiTree *p)
{
if(!T) //查找不成功(为空树)
{
*p=f;
return FALSE;
}
else if(key==T->data) //查找成功
{
*p=T;
return TRUE;
}
else if(keydata)
return SearchBST(T->lchild,key,T,p); //在左子树继续查找
else
return SearchBST(T->rchild,key,T,p); //在右子树继续查找
} 实例: 假如有一数据集合={62,88,58,47,35,73,51,99,37,93},查找的关键字key=93。 使用二叉排序树查找算法步骤如下: ①根据二叉排序树定义将该数据集合构造成一棵二叉排序树(中序遍历);
②调用二叉排序树查询算法SearchBST(T,93,NULL,P)查询关键字,其中,SearchBST函数是一个可递归运行的函数,参数T是一个二叉树链表、key代表要查询的关键字、二叉树f指向T的双亲。当T指向根结点时,f的初值就为NULL,它在递归时有用,最后的参数p是为了查找成功后可以得到查找到的结点位置。 ③ if(!T){ .... }语句。用来判断当前二叉树是否到叶子结点,此时当前T指向根结点62的位置,由于T不为空,故该语句片段不执行。 ④esle if(key==T->data)语句。即查找到相匹配的关键字执行语句,显然93!=62,故该语句片段不执行。 ⑤else if(key
⑦此时第二层SearchBST,因93比88大,所以执行else{....}语句,再次递归调用SearchBST(T->rchild,key,T,p)。此时T指向了88的右孩子99。
⑧此时第三层SearchBST,因93比99小,所以执行else if(key
/*当二叉排序树T中不存在关键字等于key的数据元素时,
* 插入key并返回TRUE,否则返回FALSE*/
Status InsertBST(BiTree *T,int key)
{
BiTree p,s;
/*调用查找函数查找是否存在该关键字*/
//a.若查找不成功
if(!SearchBST(*T,key,NULL,&p))
{
s=(BiTree)malloc(sizeof(BiTNode)); //为结点s开辟一段内存空间
s->data=key; //将关键字存放到s指向结点的数据域中
s->lchid=s->rchild=NULL; //初始化结点s的左右指针域
if(!p)
*T=s; //插入s为新的根结点
else if(keydata)//若关键字小于p结点数据值,插入s为结点p的左孩子
p->lchild = s;
else //若关键字大于p结点数据值,插入s为结点p的右孩子
p->rchild=s;
}
/*树中已有关键字相同的结点,不再插入*/
else
{
return FALSE;
}
} 举例:假如我们调用函数是"InsertBST(T,93);",那么结果就是FALSE;假如调用函数为"InsertBST(T,95);",那么一定是就是在93的结点增加一个右孩子95,并返回TRUE。需要注意的是,由于插入算法事先调用了SearchBST(*T,key,NULL,&p)查找算法且使用中序遍历二叉树,最终我们可知指针p指向的结点为93.
3.构建二叉排序树算法
/*假如有一个数据集={62,88,58,47,35,73,51,99,37,93}
* 构建一个二叉排序树*/
int i;
int a[0]={62,88,58,47,35,73,51,99,37,93};
BiTree T=NULL;
for(i=0;i<10;i++)
{
InsertBST(&T,a[i]);
}
4.二叉排序树删除操作算法
(1)采用递归方式对二叉排序树T查找key,找到后调用Delete函数删除该结点 /*若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素结点 * 并返回TRUE;否则返回FALSE*/
Status DeleteBST(BiTree *T,int key)
{
if(!*T) //不存在关键字等于key的数据元素
return FALSE;
else
{
if(key==(*T)->data) //找到关键字等于key的数据元素
return Delete(T); //调用Delete函数删除该结点
else if(key<(*T)->data)
return DeleteBST(&(*T)->lchild,key);
else
return DeleteBST(&(*T)->rchild,key);
}
} (2)Delete删除算法
/*从二叉排序树中删除结点p,并重接它的左或右子树*/