张三思读博客 教你跟面试官说清楚平衡二叉树怎么旋转

标题: 平衡二叉树(树的旋转)
作者: 清塘荷韵_kathy
原文链接: https://blog.csdn.net/qq_24336773/article/details/81712866

扩充:张三思

1.概念

平衡二叉树建立在二叉排序树的基础上,目的是使二叉排序树的平均查找长度更小,即让各结点的深度尽可能小,因此,树中每个结点的两棵子树的深度不要偏差太大。

平衡二叉树的 递归定义 :平衡二叉树是一棵二叉树,其可以为空,或满足如下2个性质:①左右子树深度之差的绝对值不大于1。②左右子树都是平衡二叉树。

平衡因子 的概念:结点的平衡因子 = 结点的左子树深度 — 结点的右子树深度。
若平衡因子的取值为-1、0或1时,该节点是平衡的,否则是不平衡的。

最低不平衡结点 的概念:用A表示最低不平衡结点,则A的祖先结点可能有不平衡的,但其所有后代结点都是平衡的。

2.平衡化的实现

整个实现过程是通过在一棵平衡二叉树中依次插入元素(按照二叉排序树的方式),若出现不平衡,则要根据新插入的结点与最低不平衡结点的位置关系进行相应的调整。分为LL型、RR型、LR型和RL型4种类型,各调整方法如下(下面用A表示最低不平衡结点):

(1)LL型调整:

由于在A的左孩子(L)的左子树(L)上插入新结点,使原来平衡二叉树变得不平衡,此时A的平衡因子由1增至2。下面图1是LL型的最简单形式。显然,按照大小关系,结点B应作为新的根结点,其余两个节点分别作为左右孩子节点才能平衡,A结点就好像是绕结点B顺时针旋转一样。

图1 最简单的LL型调整

LL型调整的一般形式如下图2所示,表示在A的左孩子B的左子树BL(不一定为空)中插入结点(图中阴影部分所示)而导致不平衡( h
表示子树的深度)。这种情况调整如下:①将A的左孩子B提升为新的根结点;②将原来的根结点A降为B的右孩子;③各子树按大小关系连接(BL和AR不变,BR调整为A的左子树)。

图2 一般形式的LL型调整

张三思评:

我现在来说一下我的看法,我希望我的概括能让各位自己拿自己的语言描述出来。如果面试官问你怎么旋转,你也能跟他掰扯的清清楚楚。

当我们插入一个结点导致AVL树失去平衡的时候,我们需要找到旋转点。这个旋转点的确定是核心。我们会分情况进行讨论。

在这里,我们先说LL型怎么找旋转点,以及为什么要这么找。

(1)第一步,我们找到第一个因为插入而不平衡的结点,

(2)第二步,我们找到这个结点的第一个左孩子,选择它为旋转点,让这个不平衡的结点作为它的右孩子,如果这个旋转点本身有右孩子,过继给本来不平衡的那个结点。

(3)至此,LL型旋转完成。

现在我解释一下为什么要这么旋转:LL型旋转,也就是插入结点在不平衡结点的左孩子的左子树上,也就是说明不平衡的结点的右子树的结点数量已经比左子树的至少少2个了。这个时候,我们需要找到第一个比不平衡的根结点小的结点,让它来当旋转点。自然而然,也就是不平衡的结点的左孩子了。右子树的数量再加上根节点的数量,刚好保持平衡数量,让他们的结点数量差控制在一个以内。

我们下面接着说RR旋转。

(2)RR型调整:

由于在A的右孩子®的右子树®上插入新结点,使原来平衡二叉树变得不平衡,此时A的平衡因子由-1变为-2。图3是RR型的最简单形式。显然,按照大小关系,结点B应作为新的根结点,其余两个节点分别作为左右孩子节点才能平衡,A结点就好像是绕结点B逆时针旋转一样。

图3 最简单的RR型调整

RR型调整的一般形式如下图4所示,表示在A的右孩子B的右子树BR(不一定为空)中插入结点(图中阴影部分所示)而导致不平衡( h
表示子树的深度)。这种情况调整如下:①将A的右孩子B提升为新的根结点;②将原来的根结点A降为B的左孩子;③各子树按大小关系连接(AL和BR不变,BL调整为A的右子树)。

图4 一般形式的RR型调整

张三思评:

我们接着说RR旋转。

当我们插入一个结点导致AVL树失去平衡的时候,我们需要找到旋转点。这个旋转点的确定是核心。

在这里,我们现在看RR型怎么找旋转点,以及为什么要这么找。

(1)第一步,我们找到第一个因为插入而不平衡的结点,

(2)第二步,我们找到这个结点的第一个右孩子,选择它为旋转点,让这个不平衡的结点作为它的左孩子,如果这个旋转点本身有左孩子,过继给本来不平衡的那个结点。

(3)至此,RR型旋转完成。

现在我解释一下为什么要这么旋转:RR型旋转,也就是插入结点在不平衡结点的右孩子的右子树上,也就是说明不平衡的结点的左子树的结点数量已经比右子树的至少差2个了。这个时候,我们需要找到第一个比不平衡的结点大的结点,让它来当旋转点。自然而然,也就是不平衡的结点的右孩子了。右子树的数量再加上根节点的数量,刚好保持平衡数量,让他们的结点数量差控制在一个以内。

我们下面接着说LR旋转。

(3)LR型调整:

由于在A的左孩子(L)的右子树®上插入新结点,使原来平衡二叉树变得不平衡,此时A的平衡因子由1变为2。图5是LR型的最简单形式。显然,按照大小关系,结点C应作为新的根结点,其余两个节点分别作为左右孩子节点才能平衡。

图5 最简单的LR型调整

LR型调整的一般形式如下图6所示,表示在A的左孩子B的右子树(根结点为C,不一定为空)中插入结点(图中两个阴影部分之一)而导致不平衡( h
表示子树的深度)。这种情况调整如下:①将C的右孩子B提升为新的根结点;②将原来的根结点A降为C的右孩子;③各子树按大小关系连接(BL和AR不变,CL和CR分别调整为B的右子树和A的左子树)。

图6 一般形式的LR型调整

张三思评:

我们接着说LR旋转。

当我们插入一个结点导致AVL树失去平衡的时候,我们需要找到旋转点。这个旋转点的确定是核心。

在这里,我们现在看LR型怎么找旋转点,以及为什么要这么找。

(1)第一步,我们找到第一个因为插入而不平衡的结点,

(2)第二步,我们找到这个结点的左孩子的右孩子,也即是LR方向的孙子,选择它为旋转点,让这个不平衡的结点作为它的右孩子,如果这个旋转点本身有孩子,过继给本来不平衡的那个结点,也即是它爷爷,还有它爸爸。具体怎么过继的,把旋转点的左孩子过继给它爸爸当右孩子,把旋转点的右孩子过继给它爷爷当左孩子。

(3)至此,RL型旋转完成。

现在我解释一下为什么要这么旋转:RR型旋转,也就是插入结点在不平衡结点的右孩子的右子树上,也就是说明不平衡的结点的左子树的结点数量已经比右子树的至少差2个了。这个时候,我们需要找到第二个比不平衡的结点小的结点,让它来当旋转点。自然而然,也就是不平衡的结点的LR方向的孙子了。右子树的数量再加上不平衡的结点的数量1,刚好保持平衡高度,让他们的高度差控制在一个以内。

这里说的有点复杂了,但是你们看着图就能理解,总之我们找的旋转点,就是不平衡LR方向的大孙子。让这个大孙子给它爷爷当爹,也给爸爸当爹…

最后的RL就同理,不说了。

总之,感谢原博主的图文,我希望自己的总结能够进一步帮助大家在面试的时候能够清楚的把这个步骤表达出来,能跟别人说清楚,这样才真的算你会了。

如果有空再说下一下红黑树的旋转。欢迎关注我的博客,张三思继续带你看优秀的博客。

(4)RL型调整:

由于在A的右孩子®的左子树(L)上插入新结点,使原来平衡二叉树变得不平衡,此时A的平衡因子由-1变为-2。图7是RL型的最简单形式。显然,按照大小关系,结点C应作为新的根结点,其余两个节点分别作为左右孩子节点才能平衡。

图7 最简单的RL型调整

RL型调整的一般形式如下图8所示,表示在A的右孩子B的左子树(根结点为C,不一定为空)中插入结点(图中两个阴影部分之一)而导致不平衡( h
表示子树的深度)。这种情况调整如下:①将C的右孩子B提升为新的根结点;②将原来的根结点A降为C的左孩子;③各子树按大小关系连接(AL和BR不变,CL和CR分别调整为A的右子树和B的左子树)。

图8 一般形式的RL型调整

平衡二叉树的深度接近log2n的数量级,从而保证在二叉排序树上插入、删除和查找等操作的平均时间复杂度为O(log2n)。

实例

此处附上一张自己理解过程的图。 这里写图片描述
其中,对于第10步插入18后,为什么要进行调整,刚开始理解有偏差,还疑惑了好一阵。后来才发现,自己对平衡因子的理解出错了。

找平衡因子,平衡因子看哪个值先为-2(哪个根左右子树或子树高度差超过1,这个根的平衡因子就为-2,并且如果有两个平衡因子-2的,旋转那个靠近插入值那边的那个根)
这里写图片描述
如图所示,节点16的平衡因子为-2,产生了不平衡,因此从16开始调整(旋转),执行RL调整。

对于8->9的旋转过程具体如下:
在这里插入图片描述

其他相关实例: https://blog.csdn.net/wxbmelisky/article/details/47787963

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值