添加新节点时维护平衡二叉树的算法

时间:2014-04-04 23:05:06

标签: php algorithm binary-tree

      _  A _          - depth 1
   _ B       _C_      - depth 2
  D         E   _F_   - depth 3
               G   H  - depth 4

假设我有二叉树,我想添加新节点 - I,J,K,L,M,N,O。值没有排序/排序。添加节点可以是任何值。

添加I时,应将其添加到B下,以便深度3均衡。

      _  A _          - depth 1
   _ B_      _C_      - depth 2
  D    I    E   _F_   - depth 3
               G   H  - depth 4

现在,由于深度3已满,J必须在D之下。 K也是。

      _  A _          - depth 1
   _ B_      _C_      - depth 2
 _D_   I    E   _F_   - depth 3
J   K          G   H  - depth 4

当然,L,M,N必须以相同的方式插入。

      _  A  _            - depth 1
   _ B_       _C_        - depth 2
 _D_  _I_   _E_   _F_    - depth 3
J   K L  M  N  O  G  H   - depth 4

换句话说,我试图在树中找到任何缺失点以添加节点,然后再继续下一个深度。

我正在寻找一种快速算法,可以完成这项工作或参考,很好地解释了这个算法。

嗯......这是一个可选的东西...但是如果这个算法可以用嵌套集模型来完成真的很棒,因为我正在应用它来存储整个树D b。我正在使用的语言是 PHP

注意:

抱歉,我故意跳过此要求澄清并专注于问题本身。

树可能不平衡的原因是,将添加一个没有未知父节点的节点来填充空白点(如示例),但知道其父节点的节点将直接添加到其父节点下(如果父节点)已经有两个节点,然后它将根据算法定位在低于父深度的某个位置。例如,

      _  A _          - depth 1
   _ B       _C_      - depth 2
  D         E   _F_   - depth 3
               G   H  - depth 4

这里,假设节点X已经知道它的父H。然后,节点X将被添加到H下。不是问题。

      _  A _          - depth 1
   _ B       _C_      - depth 2
  D         E   _F_   - depth 3
               G   _H  - depth 4
                  X

现在,添加了没有父节点的节点P.然后它应该看起来像这样

      _  A _          - depth 1
   _ B_      _C_      - depth 2
  D    P    E   _F_   - depth 3
               G   _H  - depth 4
                  X

让我们说节点Z的父节点也是F但它已经满了。在这种情况下,必须应用算法,并且节点Z必须在节点G下以平衡节点F的子树。

      _  A _          - depth 1
   _ B_      _C_      - depth 2
  D     P   E   _F_   - depth 3
              _G   _H  - depth 4
             Z    X    - depth 5

节点知道其父节点是整棵树可能失衡的原因。

1 个答案:

答案 0 :(得分:0)

考虑这种方法:

在每个节点上,保留两个值:

  • 最大左深度:左子树中叶子的最大深度
  • 最大右侧深度:右侧子树中叶子的最大深度

选择最大深度较小的方向。

递归。

BTW,这个例子有误导性,当双方几乎平衡时,你可能会从稳定的状态开始。