为什么二叉树的节点只有从父节点到子节点的链接?

时间:2017-01-02 05:43:22

标签: data-structures tree

为什么二叉树的节点只有从父节点到子节点的链接?我知道有线程二叉树,但那些更难实现。具有两个链接的二叉树将允许在没有堆栈或队列的情况下迭代地遍历两个方向。

我不知道任何这样的设计。如果有,请告诉我。

Edit1:让我想一个问题。我希望在没有递归的情况下进行遍历,并且不使用堆栈或队列形式的额外内存。

PS:我担心我会因为这个愚蠢的问题而得到剥落和贬值。

3 个答案:

答案 0 :(得分:1)

一些二元树确实要求孩子跟上他们的父母,甚至他们的祖父母,例如戏剧树。然而,这只是为了平衡或展开树。我们只遍历从父级到子级的树的原因是因为我们通常在搜索特定节点,并且只要实现二叉树使得所有左子节点都小于父节点,并且所有正确的子节点都更大比父母(或反之亦然),我们只需要在一个方向上的链接来找到该节点。我们从根开始搜索然后迭代,如果节点在树中,我们保证找到它。如果我们从一个叶子开始,我们无法保证通过返回根目录找到我们想要的节点。我们没有从孩子到父母的链接的原因是因为搜索没有必要。希望这会有所帮助。

答案 1 :(得分:0)

但是,我们应该考虑内存使用和复杂性之间的平衡。

是的,您可以在每个节点中使用额外的链接遍历二叉树,但实际上您使用与使用队列进行遍历相同的额外内存,甚至可以更快地运行。

什么二元搜索树擅长的是它可以在O(logN)中实现许多搜索问题。它足够快,节省内存。

答案 2 :(得分:0)

  

让我想一个问题。我想在没有递归的情况下进行遍历,并且不使用堆栈或队列形式的额外内存。

您是否认为树中的父指针本身会占用空间?

他们将O(N)内存添加到树中以存储父指针,以便在递归期间不使用O(log N)空间。

父指针允许我们做的是支持API,调用者可以将指针传递给节点并在其上请求操作,例如“按顺序查找下一个节点”(例如)。

在这种情况下,我们没有一个堆栈来保存根路径;我们只是从调用者那里收到一个“突然出现”的节点。使用父指针,给定一个树节点,我们可以在摊销的常数时间O(1)中找到它的后继。

不需要此功能的实现可以通过不在树中包含父指针,并使用递归或显式堆栈结构进行根到叶子遍历来节省空间。