二叉排序树和平衡二叉树
1.二叉排序树
二叉排序树(简称BST),也称二叉查找树。结点值左小右大,递归定义。search or sort? whatever...
1.1二叉排序树的删除
-
如果被删除节点z是叶结点,则直接删除,不会破坏二叉排序树的性质。
-
若节点z只有一颗左子树或右子树,则让z的子树成为z父结点的子树,代替z的位置。
-
若结点z有左、右两棵子树,则令z的直接后继(或直接前驱)代替z,然后从二叉排序树中删去这个直接后继(或直接前驱)。这样就转换成了第一种或第二种情况。(中序遍历)

(c)的中序遍历: 09 17 23 45 53 65 78 81 88 94
78的直接前驱是65 直接后驱是81
方式一:用65代替78的位置 删除结点65 65为叶子结点,删除结点65对应第一种删除情况
方式二:用81代替78的位置 删除结点81 81有一棵右子树,删除结点81对应第二种删除情况
2.平衡二叉树(Balanced Binary Tree)
为了避免树高增长过快,降低二叉排序树的性能,规定在插入和删除二叉树结点时候要保证任意结点的左、右子树高度差的绝对值不超过1,将这样的二叉树称为平衡二叉树,简称平衡树(AVL树)。
平衡因子(BF,Balance Factor):某结点左子树与右子树的高度差。平衡二叉树的每个结点的BF={0,1,-1}。若|BF|>1,需要调整各结点的位置关系,使之重新达到平衡。
2.1平衡二叉树插入时的平衡调整
AVL的插入过程前半部分与二叉排序树相同。
但在插入新结点后,如果造成了树的不平衡,需要调整最小不平衡子树,此时的最小不平衡子树即为在插入路径上离插入结点最近的平衡因子的绝对值大于1的结点作为根的子树。调整好最小不平衡子树后,其他结点的BF都会恢复原样,二叉树会恢复平衡。

四种调整方法:http://www.icourse163.org/learn/ZJU-93001?tid=120001 数据结构-浙江大学陈越、何钦铭 4.2 平衡二叉树
对应的B站搬运:https://www.bilibili.com/video/BV1wx41147pP?p=2
LR和RL类型王道考研书分两步进行旋转,浙大这个视频一步到位。但代码实现的时候是按两步走实现的。
/**
* 代码思路参考
*/
public void balance(Node node) { //调整|BF|>1的结点
if (node == null) {
return;
}
if (node.leftHeight() - node.rightHeight() > 1) { //左高右低 -->右旋
if (node.left.rightHeight() > node.left.leftHeight()) { //如果是LR类型 先对node的左子树左旋
node.left.leftRotate();
}
node.rightRotate();
} else if (node.rightHeight() - node.leftHeight() > 1) { //右高左低 -->左旋
if (node.right.leftHeight() > node.right.rightHeight()) { //如果是RL类型 先对node的右子树右旋
node.right.rightRotate();
}
node.leftRotate();
}
}
作者:码农StayUp
链接:https://www.imooc.com/article/313426?block_id=tuijian_wz
来源:慕课网
2.2平衡二叉树删除时的平衡调整
删除操作同二叉排序树,删除结点若导致平衡二叉树失衡,需对二叉树进行平衡调整。
平衡调整:是递归进行的,删除某个结点形成新子树后,在递归返回由下至上的过程中不断地balance(node),直到balance(根节点)。
在插入时,进行一次平衡处理,整棵树都会处于平衡状态,而在删除时,需要进行多次平衡处理,才能保证树处于平衡状态。

浙公网安备 33010602011771号