平衡树
-
平衡因子: 左子树与右子树的高度差
-
平衡树:二叉树中每个结点的平衡度的绝对值都小于等于1
-
高度一定的平衡树可能具有的最多结点和最少结点(递推)
平衡查找树和丰满查找树的查找效率接近
查找树:中序有序
平衡树:平衡因子绝对值不大于1
-
插入
插入:
不考虑结点的平衡度,使用在查找树中插入新结点的算法, 把新结点k插入树中,同时置新结点平衡度 β ( k ) = 0 \beta(k)=0 β(k)=0
平衡:
调整平衡度,确定需要调整的范围——最小不平衡子树。
改组:
改变以 k i k_i ki为根的子树的形态,使得新子树的高度和插入以前以 k i k_i ki为根的子树的高度相同,同时新子树是一棵平衡查找树
改组方法:LL,LR,RR,RL
-
LL:在结点A的左子树的左子树上插入新结点导致失去平衡
将A改为B右子树,B原来的右子树BR改为A的左 子树。 -
LR型:在结点A的左子树的右子树上插入新结点失去平衡
首先将B改为C的左子树,而C原来的左子树CL改为B的右子树,然 后将A改为C的右子树,C原来的右子树CR改为A的左子树。(相当于对B先左旋转,
再对A执行右旋转)
-
-
删除
先找到最底部不平衡的子树,将其恢复平衡。再根据情况判断 需不需要继续沿着子树向上恢复平衡。 为了找到最底部不平衡的子树,将删除操作迁移到最底部的子 树上进行(让被删除的结点v,最多有一个孩子。如果v有两个孩 子,则用它的中序的前一个结点代替它,然后删除它的中序的前一个结点)。
- 保证要删除的结点x,最多只有一个子结点。
- 删除结点x,x的parent将指向x的指针指向x的子结点(or to NULL,if no child)。从x的parent结点(记为p)起,向树根 方向不断检查,需要时进行调整。设置布尔变量shorten,初始
为true,直到某次调整后树的高度不减小,则为false,停止。