我应该将父指针存储在树/图节点中吗?

时间:2010-12-28 20:23:39

标签: c++ data-structures graph tree

我正在开发类似数据结构的树/图。 它应该更像是有向无环图。 其中一个要求是找到从根到特定节点的路径,这意味着当用户选择一个节点时,将突出显示来自根的路径。

所以,问题是我应该在每个节点中存储父指针吗? 或者更普遍的问题是我应该何时在每个节点中存储父指针? 有哪些优点和缺点?

提前致谢!

PS。 parent pointer ==指向父节点的指针。

4 个答案:

答案 0 :(得分:10)

通常,只有当您要使用需要它的算法时,才将指针存储回父级。否则,在用于存储指针的内存和在插入节点或重新平衡/重新组织树时更新这些指针的额外复杂性方面都是不必要的开销。

与树一起使用的典型算法(广度优先和深度优先搜索和遍历)不需要父指针,这就是为什么普通的普通树实现通常不包含它们。 / p>

您的“从根突出显示路径”要求可能会使父指针变得有用,尽管还有其他方法可以实现它。通常,应该避免将冗余信息放入数据结构中,直到证明它们是出于性能原因而必需的。

答案 1 :(得分:3)

详细说明克里斯托弗·约翰逊的答复:“你应该只保留一个指向你父母的指针”。

请记住,对于遍历树/图的许多算法,在遍历期间,您正在从父项传输到子项,因此实际上您已拥有父指针。您可以使用此父指针(例如将其传递给递归函数),而不是支付将其保留在结构中的成本。

另一点:对于一般图形,这个问题与“我应该在节点中存储边缘(除了边缘外)”相同吗?“。如果查看boost graph library,您将找到一个模板库,允许您在编译时进行此选择。

答案 2 :(得分:0)

存储父指针的开销与更新树/图的频率以及其中的节点数有关。不为某些算法存储父指针的开销取决于它们运行的​​频率。我不能告诉你更新地图的频率或者你需要父指针的频率,但我的建议是实现两者并运行一个分析器,或根据哪些操作花费更多时间做出某种逻辑决定。 / p>

答案 3 :(得分:0)

如果以后可以更改(扩展)此结构(并且对于大多数代码 可能),我建议推迟添加此链接,直到明确需要它为止。

添加内容比使用代码时删除要简单得多......

但在设计数据结构时,考虑几个潜在的扩展仍然很有用......