平衡二叉树删除结点后的调整操作

1.回顾插入操作

  • ·插入新结点后,要保持二叉排序树的特性不变(左<中<右)
  • 若插入新结点导致不平衡,则需要调整平衡。

2.删除操作

  • 删除结点后,要保持二叉排序树的特性不变(左<中<右)
  • 若删除结点导致不平衡,则需要调整平衡。

1.具体步骤:

1 . 用二叉排序树的方法删除结点:详情见:二叉排序树删除规则

  • 若删除的结点是叶子,直接删。
  • 若删除的结点只有一个子树,用子树顶替删除位置。
  • 若删除的结点有两棵子树,用前驱(或后继)结点。
  • 顶替,并转换为对前驱(或后继)结点的删除。

2 . 从叶子结点一路向上找“最小不平衡子树”
3 . 若找到了最小平衡二叉树,找到高度最大的儿子结点和孙子结点。
平衡二叉树删除结点后的调整操作_第1张图片

4 . 根据其树高最大的孙子结点的位置,调整平衡二叉树:(LL,RR,LR,RL四种情况)

  • 孙子在LL:儿子右单旋
  • 孙子在RR:儿子左单旋
  • 孙子在LR:孙子先左旋,再右旋
  • 孙子在RL:孙子先右旋,再左旋

具体二叉树旋转操作见博客:平衡二叉树的定义,插入操作以及插入新结点后的调整规则(ALV树)

5 . 如果调整后不平衡,则继续向上调整(进行第二步),直到二叉树平衡。

  • 对最小不平衡子树的旋转可能导致树变矮,从而导致上层祖先不平衡(不平衡向上传递)

3.时间复杂度

平衡二叉树删除操作时间复杂度为 O ( l o g 2 n ) O(log_2n) O(log2n)

你可能感兴趣的:(数据结构与算法,算法,数据结构)