【问题标题】:bottom up tree traversal starting from a particular leaf从特定叶子开始的自下而上树遍历
【发布时间】:2017-03-27 15:39:05
【问题描述】:

我正在寻找一种自下而上遍历树的方法,这样我就可以从我选择的特定叶子开始,然后继续到根。

预期输出:在我的链接 sample tree 中的示例树图像(取自 here)中,如果我指定从 Y 开始,算法将返回 YXZWVUT。

如果能提供任何帮助,我将不胜感激。

【问题讨论】:

  • 您需要在每个节点添加对父元素的引用。
  • 取决于您如何表示树。要点是你必须知道每个节点的父节点,这可以通过在每个节点中存储一个父指针来完成,或者在二叉树的某些实现中使用像x/2这样的普通数学公式等。你可以轻松实现你的目标如果你知道每个节点的父节点 && 你知道一个节点是否是根节点
  • @shole 我在每个节点上都有对父元素的引用,但我一直坚持如何通过算法有效地做到这一点。我的树不是二叉树。
  • 我不明白。如果您有对父级的引用,它不只是循环直到您到达根目录吗?这是界限,因为您只访问路径上的所有节点一次,这显然是不可避免的。那么你在纠结什么,也许你可以描述更多我们可以帮助你的东西:)
  • @shole 抱歉,如果我没有正确澄清。从我选择的叶子开始 - 特别是最深的节点(叶子) - 我想访问/打印整个树的每个节点并最终到达根。

标签: java algorithm tree


【解决方案1】:

如果我正确理解了这个问题,这就是问题陈述

遍历 n 叉树,从叶节点开始,一直到根节点,这样在遍历其所有子节点之前,不会遍历任何节点。遍历的第一个节点永远是叶子节点,遍历的最后一个节点永远是根节点。

这可以通过使用两个递归函数来解决,TraverseUp() 是主函数,它调用自身,另一个递归函数 PostOrderTraversal() 调用自身。数组 A 需要通过引用传递,并且将包含最终遍历的列表。这是一些伪代码:

TraverseUp(Array *A, Node *n) {
  // Add n to A to maintain bottom up nature
  if (!n) return;
  A.add(n)

  // Go to parent
  Node *p = n.parent();
  if (!p) return;

  // For each child of p other than n, do a post order traversal
  foreach(Node *c in p.children) {
    if (c == n) continue;
    PostOrderTraversal(A, c);
  }
  // When done with adding all p's children, continue traversing up
  TraverseUp(A, p);
}

// Standard implementation of post order traversal
PostOrderTraversal(Array *A, Node *n) {
  if (!n) return;
  foreach(Node *c in n.children) {
    PostOrderTraversal(A, c);
    A.add(c);
  }
}

【讨论】:

  • 看起来不错!这个算法的复杂度是多少?
  • 应该是O(n)
猜你喜欢
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多