【问题标题】:PostOrder Traversal of tree without using recursion or stack [duplicate]不使用递归或堆栈的树的后序遍历[重复]
【发布时间】:2012-05-22 07:54:04
【问题描述】:

可能重复:
Post order traversal of binary tree without recursion

我正在研究莫里斯的二叉树中的中序遍历算法。 有人可以建议是否有一种方法可以在不使用递归和堆栈的情况下遍历postorder

【问题讨论】:

  • this question中有几个答案
  • 你的树是否有从子节点到父节点的链接?如果是这样,您可以与访客一起完成。

标签: c algorithm


【解决方案1】:

您可以使用threaded tree 来完成此操作。以下是该方法的概要(取自here——参见幻灯片 31):

  • 后序:创建的虚拟节点以根为左后代。
  • 变量可用于检查当前操作的类型。
  • 如果动作是左遍历并且当前节点有左后代,那么后代 被遍历。否则操作改为右遍历。
  • 如果操作是右遍历且当前节点有左后代,则操作已更改 向左遍历。否则操作更改为访问节点。
  • 如果操作正在访问节点:访问当前节点,然后访问其后序后继节点 必须找到。
  • 如果当前节点的父节点可通过线程访问(即当前节点是父节点 left child) 然后遍历设置为继续使用 parent 的右后代。
  • 如果当前节点没有右后代,这是右扩展链的末端 节点数。
  • 首先:通过当前节点的线程到达链的开头。
  • 第二:链中节点的右引用被反转。
  • 最后:反向扫描链,访问每个节点,然后右引用 恢复到以前的设置。

正如以上参考继续表明的那样,如果您对树结构使用临时修改,也可以在不使用线程的情况下完成。

【讨论】:

  • 有没有更简单的方法来理解这个?原谅我的无知,但我真的很想用更简单的方式理解它。
  • @rgaut - 我不确定是否有更简单的方法来理解这一点。没有堆栈的后序遍历(或递归,它是一个隐式堆栈)只涉及大量仔细的簿记。使用一个简单但不平凡的示例以及算法每个步骤发生的情况的一些图表可能更容易理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 2014-02-03
  • 2010-11-20
相关资源
最近更新 更多