5、二叉搜索树与平衡二叉树(BST & AVL)
一、二叉搜索树
1.二叉搜索树是什么
二叉搜索树(BST,Binary Search Tree),又称二叉排序树或二叉查找树,是一棵二叉树,可以为空,当不为空时满足以下性质:
非空左子树的所有键值小于其根结点的键值
非空右子树的所有键值大于其根结点的键值
左、右子树都为二叉搜索树

2.二叉搜索树的操作函数
(1)二叉搜索树的查找操作Find
要查找的值为X
从根结点开始查找,若树为空,则返回NULL
若搜索树非空,则将X与根节点的键值进行比较并进行以下处理
若X小于根结点键值,则在左子树中搜索
若X大于根结点键值,则在右子树中搜索
若X与根结点键值相等,则搜索完成,返回指向该结点的指针
尾递归实现
迭代函数实现
(2)查找最大元素和最小元素
最大元素一定是在树的最右分支的端结点上
最小元素一定是在树的最左分支的端结点上

查找最大元素
递归函数
迭代函数
查找最小元素
递归函数
迭代函数
(3)二叉搜索树的插入
要保证插入后还为二叉搜索树,关键时要找到元素应该插入的位置。
(4)二叉搜索树的删除
考虑三种情况
要删除的是叶结点:直接删除,并修改其父结点的指针
要删除的结点只有一个孩子结点:将其父节点的指针指向要删除结点的孩子结点

要删除的结点有左、右两棵子树:要用另一个结点替代被删除的结点(右子树的最小元素或左子树的最大元素)
二、平衡二叉树
1.平衡二叉树是什么
平衡二叉树(AVL树,Banlanced Binary Tree ),可以为空,当不为空时满足以下性质:
任一结点左、右子树高度差的绝对值不超过1
给定结点数为n的AVL树的最大高度为O(log
2n)!
平衡因子(BF,Banlanced Factor):BF(T) = hL-hR,hL和hR分别为T的左、右子树高度
2.平衡二叉树的调整
RR插入——RR旋转【右单旋】
破坏结点(麻烦结点)位于被破坏结点(发现者)的右子树的右子树上 
LL插入——LL旋转【左单旋】
破坏结点(麻烦结点)位于被破坏结点(发现者)的左子树的左子树上 
LR插入——LR旋转
破坏结点(麻烦结点)位于被破坏结点(发现者)的左子树的右子树上 
RL插入——RL旋转
破坏结点(麻烦结点)位于被破坏结点(发现者)的右子树的左子树上 
ps:有时候插入元素即便不需要调整结构,也可能需要重新计算一些平衡因子
3.平衡二叉树实现
定义部分
左单旋
ps:A必须要有一个左子节点B,将A与B进行左单旋,并更新A与B的高度返回新的根结点B
右单旋
ps:A必须要有一个右子节点B,将A与B进行右单旋,并更新A与B的高度返回新的根结点B
LR旋转
ps:A必须要有一个左子节点B,且B必须有一个右子节点C 先将B与C做右单旋,返回C 再将A与C做左单旋,返回C
RL旋转
ps:A必须要有一个右子节点B,且B必须有一个左子节点C 先将B与C做左单旋,返回C 再将A与C做右单旋,返回C
插入
将X插入AVL树T中,并返回调整后的AVL树
完整代码演示
输出结果:
421365879 123456789
根据前序遍历与中序遍历易还原得到这样一个平衡二叉树

三、判断是否同一棵二叉搜索树
题意:给定一个插入序列确定唯一一棵二叉搜索树,对于输入的各种插入序列,判断它们是否能生成一样的二叉搜索树
如何判断两个序列是否对应相同搜索树呢 建一棵树,再判别其他序列是否与该树一致! 如输入3 1 4 2确定一颗二叉搜索树,判断3 4 1 2和 3 2 4 1是否对应同一棵树
1.搜索树表示
2.建搜索树T
3.判别一序列是否与搜索树T一致
方法:在树T中按顺序搜索序列3 2 4 1中的每个数
若每次搜索所经过的结点在前面均搜索过,则一致
否则(某次搜索中遇到了前面未出现的结点),则不一致
判断长度为N的插入序列产生的树是否与搜索树一致
清除T中个结点的flag标记使其为0
释放T的空间
最后更新于
这有帮助吗?