平衡二叉树插入—单旋转双旋转问题

平衡二叉树插入一个节点时,往往会造成平衡二叉树的不平衡,这时就要我们编写程序恢复平衡二叉树的平衡。下图就因为插入了1,造成了树的不平衡。

 

总的来说,消除不平衡有两种方法,一个是单旋转,另一个是双旋转,双旋转就是两次单旋转的叠加。我记得大二数据结构的教材是分了LR LL RR RL这四种情况讨论。说实话,如此的说明方法,学生很难理解,书上全是些左旋转,右旋转搞得人一头雾水。

重要的是:决定用哪个节点代替失衡节点,只有两个选择,失衡节点的儿子或者失衡节点的孙子。 

接下来就好办了,无非就是互换一些子树的一些指针而已。

下面看两个例子:


我们看到,失衡节点都是3节点,左图中,3的儿子是2,孙子是1,右图正好相反。那我们用儿子节点还是孙子节点代替3节点呢?

左图是用儿子代替3节点,右图是用孙子代替3节点,这其中的规律是:判断孙子节点的值是否介于儿子和3节点值之间,如果是,则孙子代替失衡节点,如果否,则用儿子代替失衡节点(相当做了两个单旋转,失衡节点的孙子先和失衡节点的儿子互换,然后失衡节点的儿子与失衡节点互换)。

下面我们来做个练习,先后在一颗平衡二叉树中插入3,2,1,4~7, 16~10, 8,9


插入1时,我们知道只要用儿子代替失衡节点3即可

                          

当插入5时3节点失衡了,而且孙子并不是介于3和4 之间的,所以用儿子4代替3节点

                    

中间我省略了几步,当插入15后,失衡节点是7,它的儿子是16,孙子是15。15是介于7和16的,所以我们用孙子15代替失衡节点。

后面的就留给大家自己锻炼一下吧,我就不一一说了。



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值