您的位置:首页 > 其它

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

2014-08-05 15:56 281 查看
平衡二叉树插入一个节点时,往往会造成平衡二叉树的不平衡,这时就要我们编写程序恢复平衡二叉树的平衡。下图就因为插入了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代替失衡节点。

后面的就留给大家自己锻炼一下吧,我就不一一说了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息