【问题标题】:Algorithm for maintaining balanced binary tree when adding a new node添加新节点时保持平衡二叉树的算法
【发布时间】:2014-04-05 08:31:21
【问题描述】:
      _  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

现在,J 必须在 D 之下,因为深度 3 已满。 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

节点知道其父节点是整个树可能不平衡的原因。

【问题讨论】:

  • 最明显的方法似乎是在每个节点中都有一个带符号的余额计数器,如果它是负数,则添加到左侧并递增,否则添加到右侧并递减。
  • @user3386109 抱歉。帖子不见了……所以我在这里写。就我而言,搜索不是主要问题。请把它看作是一种金字塔结构的营销,只代表人与人之间的关系。我通过使用嵌套集模型解决了大部分问题(比如找出谁有谁的关系/总结一组销售点的东西/找出用户的父母或孩子......),除了这个“添加新人的地方” ' 问题。这几乎正​​是我的客户希望我做的:S
  • 知道了,所以@500 的评论实际上是正确的答案。

标签: php algorithm binary-tree


【解决方案1】:

考虑这种方法:

在每个节点,维护两个值:

  • Max Left Depth:左子树中叶子的最大深度
  • Max Right Depth:右子树中叶子的最大深度

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

递归。

顺便说一句,该示例具有误导性,您可能会从两侧几乎平衡时的稳定状态开始。

【讨论】:

  • 啊,树可以不平衡的原因是会添加一个没有未知父节点的节点来填充一个空白点,而一个具有自己父节点的节点将直接添加到其父节点下(如果父母已经有两个节点,然后它会低于那个)。我会注意的。
  • 我会尝试 Arun 和 500 的答案。如果我觉得它对用户来说很棘手,我会坚持使用带有数组的基本二叉树算法......我觉得嵌套集模型在这里不是一个好选择
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多