平衡二叉树插入某个节点的方法
来源:互联网 发布:51单片机视频教程 编辑:程序博客网 时间:2024/06/05 20:17
- 确定违规节点的位置
每个节点Z均有一个称之为平衡因子Bf的域,它用来存储(左子树的高度-右子树的高度)所得的值,合法的取值只有-1,0,1三种,一旦出现其他值则表示以节点Z为根的子树不是一颗平衡树,此时需要进行调整。
根据二叉查找树的插入规则找到节点Z应该插入的正确的位置,插入后将节点Z的平衡因子置为0,此时节点Z给它的父节点产生了一个增量,如果节点Z是左孩子那么对父节点的平衡因子进行加1操作,否则进行减1操作,如果此时父节点的平衡因子的值非0,那么它又对它的父节点产生一个增量,重复以上步骤直到找到第一个违规节点的位置,此时违规节点的平衡因子的绝对值大于1,为了描述方便我们将违规节点命名为节点A。上述判断流程如下:
退出后判断节点Z的父节点的平衡因子是否为0,若是则此树已经平衡,否则父节点即为违规节点。
2.调整二叉树使之平衡
违规节点为A,节点A的左孩子为B,右孩子为C。分下面几种情况进行调整:
(1).节点A的平衡因子为2
(i).节点B的平衡因子为1,如图所示:
设节点A的高度为h,那么节点B的高度为h-1.当节点B的平衡因子为1时,那么Lb的高度为h-2,Rb的高度为h-3,此时节点C的高度为h-3.在这种情况下将节点A右旋即可。变换后节点A和节点B的平衡因子均变为0。
(ii).节点B的平衡因子为-1,如图所示:
由于B的平衡因子为-1,所以节点B必定有一个右孩子,先对节点B进行左旋变成第二幅图,然后对节点A进行右旋。由于Rb节点的两个孩子L和R的树高要么为h-3,要么为h-4,但是不会同时为h-4。根据节点R的树高调整节点A的平衡因子,根据节点L的树高调整节点B的平衡因子,节点Rb的平衡因子为0.
(2).节点A的平衡因子为-2
(i).节点C的平衡因子为1
由于节点C的平衡因子为1,所以节点C必定存在一个左孩子。首先将节点C进行右旋,然后对节点A进行左旋。根据节点L调整节点A的平衡因子,根据节点R调整节点C的平衡因子,节点Lc的平衡因子变为0.
(ii).节点C的平衡因子为-1,如图所示:
在这种情况下,只需要将节点C进行左旋即可完成转换。变换后节点A和节点C的平衡因子均变为0。
- 平衡二叉树插入某个节点的方法
- 平衡二叉树删除某个节点的方法
- 平衡二叉树插入节点
- 平衡二叉树 AVL 的插入节点后旋转方法分析
- 红黑树插入某个节点的方法
- 平衡二叉树操作(查询树高、平衡因子、删除节点、插入节点)
- 二叉树平衡树,插入新节点调整该子树的操作
- AVL Tree 平衡二叉树基本插入删除节点功能的实现
- AVL Tree 平衡二叉树基本插入删除节点功能的实现 .
- 二叉平衡树 插入
- 平衡二叉树的的插入
- 平衡二叉树插入的实现
- 平衡二叉树的插入、删除
- 平衡二叉树的插入实现
- 平衡二叉树的插入旋转
- 平衡二叉树的插入和旋转
- 【基础算法】:平衡二叉树的插入
- 数据结构--平衡二叉树的插入详解
- NexentaStor and Deep Sleep C-States
- 运算符重载 = 的注意
- 开启程序猿之路吧~~
- 如何在VMware虚拟机上安装Linux操作系统(Ubuntu)
- TCP/IP学习
- 平衡二叉树插入某个节点的方法
- hdu 1849 Rabbit and Grass SG定理(简单博弈)
- v5教程--数据集函数
- 一个小小的感染案例
- HDOJ 1000 A + B Problem
- struts2面试经常问到的几个问题
- Vbs也恶搞
- 为什么要学习C语言?
- SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled