当前位置: 首页 > 知识库问答 >
问题:

树遍历-从只有父指针的叶子开始?

公羊渝
2023-03-14

从概念上讲,是否可能有一个树,您可以从给定的叶节点(而不是根节点)开始遍历它,并使用父指针到达根?

我问这个问题是因为我看到有人实现了一个树,他们使用一个数组来保存所有叶节点/外部节点,每个叶节点/外部节点只指向它们的父节点,而那些父节点指向它们的父节点等等,直到你到达没有父节点的根节点。因此,它们的实现要求您从一片叶子开始,到达树中的任何地方,并且您不能“向下”树,因为她的树节点没有任何子指针,只有父指针。

我发现这个实现很有趣,因为我没有见过类似的东西,但我很好奇它是否仍然可以被视为一棵“树”。我从来没有见过一棵树是从叶子而不是根开始遍历的。我还从未见过树节点只有父指针而没有子指针的树。

共有2个答案

柯昱
2023-03-14

如果给定叶节点的数组A,则可以进行遍历。如果只给出一个叶子节点,我不知道如何遍历树。伪代码:

// initial step 
add all nodes in A to a queue Q  

//removeNode(Q) returns pointer to node at front of Q 
while((node = removeNode(Q)) != NULL) 
    /* do your operation on node */ 
    add node->parent to Q 
孔和风
2023-03-14

是的,这种结构是存在的。它通常被称为意大利面条堆。

意大利面堆对于表示“是的一部分”关系很有用。例如,如果您希望以一种使升级高效的方式表示类层次结构,那么可以将类层次结构表示为一个意大利面堆栈,每个类型的节点在其中存储指向其父类型的指针。这样,只需从节点向上走,就可以很容易地发现向上投射是否有效。

它们还经常在编译器中用于跟踪作用域信息。每个节点表示程序中的一个作用域,每个节点都有一个指向该节点的指针,该节点表示其上一级的作用域。

希望这能有所帮助!

 类似资料:
  • 在具有父子指针的通用树结构中,是否可以在不遍历完整树的情况下遍历叶节点?例如,从最左边的叶节点开始。想法是在深树上进行优化。

  • 我在编码挑战中遇到了一个问题。 完整二叉树是一种二叉树,其中除叶节点外的每个节点都有两个子节点,且树的最后一级边高度有叶节点。 您的任务很简单,给定完整二叉树的遍历,请按顺序遍历打印其

  • 这是一个相当简单的问题,我注意到当我表示一棵树时,无论我用哪种方式(后排序,按顺序,前排序)树叶总是以相同的顺序出现,从左到右。 我只是想知道为什么,这是有原因的吗? 我刚开始研究它们,就想到了这个。 编辑: 我有一棵这样的树: 叶节点为:D、E和F 预购顺序为:A、B、D、C、E、F 顺序是:D,B,A,E,C,F 后序是:D,B,E,F,C,A 叶子节点总是从左到右出现,不管我选择哪个顺序,问

  • web上有很多内容指出有四种树遍历算法: 深度优先搜索-无序(左-根-右) 预购(根-左-右) 后序(左-右-根) 广度优先搜索-级别顺序遍历 这些树遍历是由于二叉搜索树的概念获得的吗?(即,左子树比右子树小,因此我们在右之前遍历左?) 那么其他树遍历的组合呢?例如:右根左,右根左,右根左,按级别顺序从右节点开始遍历? 如果上述树遍历组合有效,那么树遍历的时间复杂度相对于其左前对应项是否保持不变?

  • 我很难理解SearchTree“按顺序遍历方法”在到达最左边的叶子后是如何向上的。我理解,一开始根变成leftchild,然后再往下一层leftchild,再往下一层,直到它变成最低的左叶,它没有左子,也没有右子。好的。但是在根是最后一片叶子之后,它怎么会变平。使traverse方法从左下的子级上升一级的确切代码行是什么。因为对于该节点,root.leftChild和root.rightChild

  • 我们已经见到了树数据结构的基本功能,现在是看树的一些额外使用模式的时候了。这些使用模式可以分为我们访问树节点的三种方式。有三种常用的模式来访问树中的所有节点。这些模式之间的差异是每个节点被访问的顺序。我们称这种访问节点方式为“遍历”。我们将看到三种遍历方式称为前序,中序和后序 。让我们更仔细地定义这三种遍历方式,然后看看这些模式有用的一些例子。 前序 - 在前序遍历中,我们首先访问根节点,然后递归