迭代二叉树中序遍历python

Iterative binary tree inorder traversal python

thisLeetCode中Q/A一个答案w/o任何内联注释演示如何完成迭代in-order二叉树遍历.

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        traversal = []

        node = root
        stack = []
        while node or stack:
            if node:
                stack.append(node)
                node = node.left
            else:
                node = stack.pop()
                traversal.append(node.val)
                node = node.right
                
        return traversal

为什么这行得通?我主要对 if node 语句感到困惑,它总是向左移动 child。 else语句必须满足node不存在,stack存在的条件,这让我很纠结

我想了解它,以便我可以调整代码以执行预或 post 顺序遍历,但不理解为什么这段代码起作用,这太过分了。

在循环的每次迭代开始时,node 表示尚未访问(根本)的子树的根。

根据“in-order遍历”的定义,我们应该先遍历一个节点的左子树,然后再进行遍历。所以这就是为什么——当我们有一个未访问的子树的根时——我们应该去 left。同时,我们注意到这个节点,因为在某个时候我们将准备好左子树,然后我们必须能够找到这个节点并且实际上 visit它。这就是为什么我们在向左移动之前将节点压入堆栈。

当未访问子树的根没有左子树时,node 显然会变成 None,因此在下一次迭代中我们会遇到 else 的情况。在那里我们再次从堆栈中弹出父节点。现在要做的第一件事是访问那个根(append),然后我们必须访问它的子树,这将在循环的下一次迭代中启动。