zoukankan      html  css  js  c++  java
  • 算法

    平衡二叉树

    今天有同学问了我如何构造平衡二叉树,总结如下:

    平衡因子 BF(balance factor)为该节点左子树高度 - 右子树高度,绝对值如果 ≤ 1,则二叉树不需要调整。

    平衡二叉树构造过程比较简单,分为四种情况:

    • LL 插入
    • RR 插入
    • LR 插入
    • RL 插入

    用实例解释一下四种情况的调整方案:

    LL 插入:
    可以计算得到 8 的 BF 为 2,受到破坏且是第一个发现的节点,
    LL 表示破坏者处于被破坏者左子树(left)的左子树(left)中。
    
    被破坏者             15
                      /    
    发现者           8	     17
                   /       
                  4
                 /
    破坏者       1
    
    此时需要发现者调整为:
    被破坏者             15
                      /    
    发现者           4	     17
                   /      
                  1    8
     
    LR 插入:
    可以计算得到 8 的 BF 为 2,受到破坏且是第一个发现的节点,
    LR 表示破坏者处于被破坏者左子树(left)的右子树(right)中。
    被破坏者             15
                      /    
    发现者           4	     17
                   /      
                  1    8
                        
                        12
    
    此时需要将                   调整为
                    15            8
                   /             / 
                  4	            4  15
                       
                    8
    
    
                        8
                      /   
                    4	  15
                   /        
                  1          17
    
    然后很重要的一步就是对 12 调整位置:
                        8
                      /    
                    4	   15
                   /      /  
                  1      12   17
    

    而其实 RR 插入是和 LL 插入的情况相似的,RL 插入和 LR 插入也是如此。其中 LR 插入这种类型比 LL 插入类型调整起来更为复杂,LL 也不是从发现者开始计算左右子树的,需要向上传递找到一系列受影响的节点,一般都是根节点出发的。

    12 这个节点之所以放在 15 的左子树中而不是放在 4 的右子树,是由于平衡二叉树节点的左子树都比节点小,右子树都比节点大的性质决定的。

    总结

    对一棵平衡二叉树插入数据,平衡因子没有被破坏就不需要调整;如果调整后不是一个二叉平衡树,不满足其节点的左子树都比节点小,右子树都比节点大的性质就说明调整的过程出错了,需要排查算法的错误。

  • 相关阅读:
    最详细最权威的Android 编码规范
    一款实用的工具手机软件
    一个简单的四则运算程序(优化)
    随笔
    一个简单的四则运算程序
    随手记(四)
    随手记(三)
    随手记(二)
    随手记(一)
    大学生生活中的三大痛点
  • 原文地址:https://www.cnblogs.com/chenxianbin/p/11984980.html
Copyright © 2011-2022 走看看