平衡二叉树插入某个节点的方法

来源:互联网 发布:51单片机视频教程 编辑:程序博客网 时间:2024/06/05 20:17
  1. 确定违规节点的位置

             每个节点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。

原创粉丝点击