我正在实现基于c#的树数据结构(主要基于Dan Vanderboom's Generic implementation)。我现在正在考虑处理Dan没有实现的Count属性。
显而易见的方法是使用递归调用,遍历树,愉快地添加节点(或者如果您愿意,可以使用队列迭代遍历树并计算节点)。这看起来很贵。 (我也可能希望延迟加载我的一些节点)。
我可以在根节点维护计数。所有子项将遍历和/或保持对根的引用,并在更改时更新内部可设置的count属性。这会将迭代问题推到我想要断开分支或清除给定节点下的所有子节点的时候。通常比较便宜,而且我认为不那么频繁地称之为功能。
似乎有点蛮力,这通常意味着我还没想过的例外情况,或者如果你愿意的话就会出现错误。
有没有人有一个实现的例子,它保留了不平衡和/或非二进制树结构的计数而不是动态计数?不要担心延迟负载,我相信我可以调整示例以满足我的特定需求。
答案 0 :(得分:1)
你可以在树上有一个count属性。在添加节点的方法中,增加计数,在删除节点的方法中,减少计数。
运行时=读取属性所需的时间。
答案 1 :(得分:1)
您似乎在考虑所有节点,并忘记了有一个Tree类来控制对节点的访问。您的Tree类可以具有Count属性,并且由于Tree类公开了Add和Remove(它们不应该由节点公开),所以您可以随时增加它并在项目更改时减少它。
答案 2 :(得分:1)
您的Node类可以计算它拥有的子节点数,每次添加或删除节点时它都会更新。然后,为了获得根节点(或任何节点)的计数,你只需要计算其所有子节点的计数。
但为了简单起见,为什么不按照D Stanley的建议去做,只是递归地实现Count?
答案 3 :(得分:0)
感谢大家的意见。我真的不想邀请辩论,只是想看看是否有人有样品,似乎并非如此。
我认为答案是没有好的样本,我需要自己完成这项工作。
我给你们每个人+1,因为你们都为我的结论做出了贡献。