【问题标题】:Tree traversal - starting at leaves with only parent pointers?树遍历 - 从只有父指针的叶子开始?
【发布时间】:2013-02-27 00:13:35
【问题描述】:

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

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

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

【问题讨论】:

  • 您基本上已经回答了自己的问题。是的,这样做完全没问题。 Windows Presentation Foundation 是为什么您想要这样做的一个很好的例子;即相对数据绑定;即遍历树直到找到一些东西,然后绑定到它。请参阅:stackoverflow.com/questions/84278/… 一个更有趣的问题是 为什么 你想要,以及为什么你只想要 parent 链接。

标签: data-structures tree abstract-data-type


【解决方案1】:

是的,这种结构存在。它通常被称为spaghetti stack

意大利面条堆栈对于表示“是一部分”关系很有用。例如,如果您想以一种提高向上转换效率的方式表示类层次结构,则可以将类层次结构表示为意大利面条堆栈,其中每种类型的节点都存储指向其父类型的指针。这样,只需从节点向上走,就很容易找到向上转换是否有效。

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

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    如果给定叶节点数组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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多