0%

平衡二叉树的插入与删除

最烦的一集,还好学会了,把经验写出来

平衡二叉树的插入

LL&RR情况

LL平衡旋转

RR平衡旋转

不管是LL还是RR,都先找到最先失调的根节点A**(也就是他的左右子树高度差大于2)**

在找到A较高的那棵子树的父亲结点B,然后B朝着A的方向旋转

以LL为例子,右旋,并且将自己的右树给A(向哪里旋转,就将被旋转的结点的 旋转方向的树给出去)

LR&RL情况

LR平衡旋转

RL平衡旋转

若将新的结点插到最先失调结点的左孩子的右树或者右孩子的左树,则使用RL或者LR

以LR为例

我们按之前的方法找到了B,也就是失调结点A的比较深的树的父亲B

再把新结点的父亲且是B的孩子,也就是B的树深最高的树的父节点C

此时将C和B替换,让C先左旋(因为是向左旋转,将CL给B),然后再右旋(因为是向右旋转,此时把CR给A)

平衡二叉树的删除

王道课上的删除步骤

这里不讨论调整完二次失衡的情况,只需要根据以下步骤再来一次即可

LL&RR情况

以此图为例,在其中75就是第一个失调的结点A

然后找到他最高子树的父节点B也就是80,因为是A的右节点B的右树较高破坏了平衡,所以使用RR,直接令80旋转到75的位置并给75一个77的右节点

LR&RL情况

以此图为例,首先找到第一个失衡的A也就是44,他最高的树的父节点是78也就是B

我们这里找到是B的左树过高导致失调,因此是LR

将50右旋送到78的位置并给78一个62的右节点,再左旋到44的位置并给48的右节点

结语

是自己总结的规律,原本的太难记了

我的规律插入和删除是一样的:

  1. 找到失调的结点A(左右树高第一次大于2)
  2. 找A的两棵子树中谁更高,将其A的这个儿子当作B
  3. 如果这个B是A的左孩子,但是是B的左树较高,就将B旋到A的位置,并且将B靠近A的子树(右旋送右,左旋送左)送给A作为子树(旋转的底层逻辑:把自己的靠着被选结点的子树送一个给被旋到的结点)
  4. 如果这个B是A的左孩子,但是是B的右树较高,则将B的右树的儿子设为C(这里就是LR了)
    先让C旋到B的位置,再旋转到A的位置