平衡二叉树插入—单旋转双旋转问题
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代替失衡节点。
后面的就留给大家自己锻炼一下吧,我就不一一说了。
总的来说,消除不平衡有两种方法,一个是单旋转,另一个是双旋转,双旋转就是两次单旋转的叠加。我记得大二数据结构的教材是分了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代替失衡节点。
后面的就留给大家自己锻炼一下吧,我就不一一说了。
相关文章推荐
- 平衡二叉树 AVL 的插入节点后旋转方法分析
- 平衡二叉树的插入和旋转
- 平衡二叉树的插入旋转
- 平衡二叉树的旋转问题
- 平衡二叉树的C语言实现(创建、插入、查找、删除、旋转)【数据结构】
- 平衡二叉树AVL - 插入节点后旋转方法分析
- 【数据结构】网易2012校园招聘题目--平衡二叉树的插入问题
- 平衡二叉树旋转,删除,插入
- 关于在WORD文档中插入图片的问题
- 现在有这样一个问题 我把上W条数据插入表内,但是发现还有一条数据没进入表里.我想查出来是哪个数据没进去. 能用查询语句查出来吗?
- 有关触发器的问题-一次插入多条
- sql2000主从表插入并发问题的解决
- 解决无法向oracle中的long型字符插入大文本的问题
- Linux下Oracle字符集问题引发的汉字插入失败解决方案
- 解决Struts插入数据库中文乱码问题
- 解决Struts插入数据库中文乱码问题
- C# 处理Oracle CLob插入或更新 字符串过长的问题
- 问题:已经有一组已完成的类,现想将一组函数插入这组类中,怎样改动最少的代码达到目的
- ASP.NET中F5刷新按键数据插入两次的问题
- Notes设计插入共享域问题