何时在树中使用父指针?

时间:2017-12-27 07:34:24

标签: algorithm optimization data-structures

我们需要在树中反复找到节点的父节点或祖先存在许多问题。因此,在这些场景中,不是在运行时找到父节点,而是使用父指针的不太复杂的方法。这是节省时间但增加空间。任何人都可以建议,在哪种问题或场景中,建议在树中使用父指针?

例如 - 树的两个节点之间的距离?

3 个答案:

答案 0 :(得分:4)

  

使用父指针。这是节省时间但增加空间。

计算机科学的经典权衡。

  

在哪种问题或场景中,建议在树中使用父指针?

如果在运行时找到父母的费用远远超过指向父母的指示。

现在,人们必须了解成本意味着什么。你自己提到了权衡:人们应该考虑是否值得花一些额外的内存来存储指针,以便加速你的程序。

答案 1 :(得分:3)

以下是我能想到的一些场景,在节点中保存父指针有助于提高时间复杂度

-> Ancestors of a given node in a binary tree
-> Union Find Algorithm
-> Maintain collection of disjoint sets
-> Merge two sets together

现在根据我的说法,对于任何类型的树问题或者trie问题都有一个父指针可以使你的遍历更容易上下或自下而上。

希望这有帮助!

答案 2 :(得分:0)

只是需要在自上而下的遍历环境之外进行有效的自下而上遍历作为一般答案的情况。

作为一个具体的例子,假设您有一个图形软件,它使用四叉树有效地仅在屏幕上绘制元素,并让用户有效地选择元素,然后单击或选择选框。

但是,在用户选择一些元素后,他们可以删除它们。删除这些元素将需要以自下而上的方式更新四叉树,更新父节点以响应叶节点变空。但是我们要删除的元素存储在不同的选择列表数据结构中。我们没有通过从上到下的树遍历来到达要删除的元素。

在这种情况下,它可能不仅实现起来要简单得多,而且计算效率也很高,可以存储从子到父的指针/索引,甚至可能是元素到叶子,因为我们正在更新树以响应发生的活动以自下而上的方式在树叶上。否则你必须从上到下工作,然后以某种方式再次备份,并且必须通过树以中到底和后退的方式集中完成这些元素的移除

对我而言,我发现的最有用的案例是树需要根据“外部世界”的叶子中发生的活动而更新的情况,可以这么说,而不是在下降的中间树,通常涉及两个或多个数据结构,而不仅仅是一个树本身。

另一个例子就是说,你有一个GUI小部件,在被点击时,它最小化其父小部件。但是我们不会从树上下来确定点击了哪个小部件。我们使用另一种数据结构,就像空间哈希一样。因此,在这种情况下,我们希望从子窗口小部件到父窗口小部件,但是我们没有通过GUI层次结构的自上而下树遍历到达子窗口小部件,因此我们没有在窗口堆栈中随时可用的父窗口小部件,例如我们通过空间查询点击了子窗口小部件到另一个数据结构。在这种情况下,如果孩子只是存储其父母,我们可以避免从根到孩子的父母。