迭代二叉树中序遍历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
),然后我们必须访问它的右子树,这将在循环的下一次迭代中启动。
在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
),然后我们必须访问它的右子树,这将在循环的下一次迭代中启动。