趁热打铁,一起把平衡二叉搜索树的操作给写一下。
AVLTree *findtree(AVLTree *T,int x) //查找函数
{
AVLTree *B;
B=NULL;
if(T!=NULL)
{
if(x<T->left->date) //如果比根节点小就进去左边找
B=findtree(T->left,x);
if(x>T->right->date) //如果比根节点大就去右边找
B=findtree(T->right,x);
}
return B;
}
//查找树中最小值
AVLTree *findmin(AVLTree *T)
{
AVLTree *B;
B=T;
if(B->left==NULL)
return B;
else
return findmin(B->left);
}
//查找树中最大值
AVLTree *findmax(AVLTree *T)
{
AVLTree *B;
B=T;
if(B->right==NULL)
return B;
else
return findmax(B->right);
}
删除的操作比较复杂,要分为三种情况
第一种情况是要删除的节点是叶结点,那么直接删除就好了;
第二种情况是该节点有一个孩子,那么就把它删了换成它的儿子;
第三种情况是该节点两个孩子都还在,那么有两种选择可以选。可以选择它左儿子的最大值或者它右儿子的最小值;如图

完整代码
AVLTree *delet(AVLTree *T,int x)
{
AVLTree *B;
if(T==NULL)
printf("未找到\n");
else
{
if(x<T->date)
T->left=delet(T->left,x);
else if(x>T->date)
T->right=delet(T->right,x);
else //找到了
{
if(T->left&&T->right) //双子健在
{
B=findmin(T->right); //找出右子的最小
T->date=B->date;
T->right=delet(T->right,T->date);
}
else //少了一个或者无子
{
B=T;
if(T->left==NULL)
T=T->right;
else
T=T->left;
free(B);
}
}
}
return T;
}
本文详细介绍了平衡二叉搜索树(AVL树)的基本操作,包括查找、删除等核心算法,并提供了具体的实现代码示例。

被折叠的 条评论
为什么被折叠?



