在上一篇文章中,我们用递归法解决了这个问题,那如何用迭代遍历解决此问题呢?
# 前序遍历-迭代-LC144_二叉树的前序遍历
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
# 根结点为空则返回空列表
if not root:
return []
stack = [root]
result = []
while stack:
node = stack.pop()
# 中结点先处理
result.append(node.val)
# 右孩子先入栈
if node.right:
stack.append(node.right)
# 左孩子后入栈
if node.left:
stack.append(node.left)
return result
代码来自代码随想录
这段代码实现了二叉树的前序遍历(Pre-order Traversal),使用了迭代的方式。这种遍历顺序是:首先访问根节点,然后访问左子树,最后访问右子树。
下面是对代码的逐行解释:
-
class Solution:
定义了一个名为Solution
的类。 -
def preorderTraversal(self, root: TreeNode) -> List[int]:
定义了该类中的一个方法preorderTraversal
,接收一个二叉树的根节点root
,返回一个整数列表。 -
if not root:
检查根节点是否为空。如果为空,执行下一行。 -
return []
如果根节点为空,返回一个空列表,表示没有节点可遍历。 -
stack = [root]
创建一个栈,并将根节点压入栈中。 -
result = []
初始化一个空列表result
,用于存储遍历结果。 -
while stack:
当栈不为空时,进入循环。 -
node = stack.pop()
从栈中弹出一个节点,将其赋值给node
,这就是当前要处理的节点。 -
result.append(node.val)
将当前节点的值添加到结果列表中。 -
if node.right:
检查当前节点是否有右子树。如果有,则执行下一行。 -
stack.append(node.right)
将右子节点压入栈中,确保在左子节点之前被处理。 -
if node.left:
检查当前节点是否有左子树。如果有,则执行下一行。 -
stack.append(node.left)
将左子节点压入栈中。 -
return result
当栈为空时,结束循环,返回结果列表,其中包含了按照前序遍历顺序访问的节点值。
总体上,这段代码使用栈结构模拟递归的方式,以迭代的方式实现了二叉树的前序遍历,保证了在处理节点时能够按照根、左、右的顺序访问。