直接回答
三种深度优先遍历的区别只在访问根节点的时机:前序是根-左-右,中序是左-根-右,后序是左-右-根。递归实现就是调整 visit 语句相对两次递归的位置;迭代实现用栈模拟。
展开解析
递归写法每棵子树都是同一个过程,代码三行以内,空间 O(h)(h 为树高)。迭代版:前序最简单,栈顶弹出后先压右孩子再压左孩子;中序需沿左链一路入栈,弹出一个访问一个再转向右子树;后序最麻烦,可用"根-右-左"前序变体再逆序,或记录上次访问节点判断右子树是否已完成。性质应用:二叉搜索树中序遍历得到升序序列;已知前序+中序可唯一重建二叉树,但前序+后序不行(无法区分单子树方向)。追问:Morris 遍历用线索化把空间降到 O(1)、层序遍历用队列。递归深度在退化成链的树上是 O(n),实际工程要留意栈深度。
示例
def preorder(root):
if not root: return
visit(root)
preorder(root.left)
preorder(root.right)