【发布时间】: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