1

我正在基于 c# 实现树数据结构(主要基于Dan Vanderboom 的通用实现)。我现在正在考虑处理 Dan 没有实现的 Count 属性的方法。

显而易见且简单的方法是使用递归调用,它遍历树愉快地添加节点(或者如果您愿意,可以使用队列和计数节点迭代遍历树)。只是看起来很贵。(我也可能想延迟加载我的一些节点)。

我可以在根节点上维护一个计数。所有子节点都将遍历和/或持有对根的引用,并在更改时更新内部可设置的计数属性。这会将迭代问题推到我想要中断分支或清除给定节点下的所有子节点的时候。通常更便宜,并且把我认为不太常用的功能放在了繁重的地方。

似乎有点蛮力,这通常意味着我还没有想到的异常情况,或者如果你愿意,还有错误。

有没有人有一个实现的例子,它保持一个不平衡和/或非二叉树结构的计数,而不是即时计数?不要担心延迟加载,我相信我可以调整示例以满足我的特定需求。

4

4 回答 4

1

你可以在树上有一个计数属性。在添加节点的方法中,增加计数,在删除节点的方法中,减少计数。

运行时间 = 读取属性所需的时间。

于 2012-10-11T21:14:04.620 回答
1

您似乎一直在考虑节点,却忘记了控制对节点的访问的 Tree 类。您的 Tree 类可以具有 Count 属性,并且由于 Add 和 Remove 都由 Tree 类公开(它们不应该由节点公开),因此您始终可以在项目更改时对其进行递增和递减。

于 2012-10-11T21:15:02.667 回答
1

您的 Node 类可以记录它拥有的子节点数量,每次添加或删除节点时都会更新这些子节点。然后要获得根节点(或任何节点,就此而言)的计数,您只需将其所有子节点的计数相加即可。

但是为了简单起见,为什么不按照 D Stanley 的建议,递归地实现 Count 呢?

于 2012-10-11T21:27:38.647 回答
0

感谢大家的意见。我并不是真的想邀请辩论,只是想看看是否有人有样本,似乎不是这样。

我认为答案是没有好的样品可用,我需要自己做这项工作。

我给了你们每个人一个+1,因为你们都为我的结论做出了贡献。

于 2012-10-12T15:07:27.643 回答