# 中序遍历-迭代-LC94_二叉树的中序遍历
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
stack = [] # 不能提前将root结点加入stack中
result = []
cur = root
while cur or stack:
# 先迭代访问最底层的左子树结点
if cur:
stack.append(cur)
cur = cur.left
# 到达最左结点后处理栈顶结点
else:
cur = stack.pop()
result.append(cur.val)
# 取栈顶元素右结点
cur = cur.right
return result
代码来自代码随想录,具体的见此链接
这段代码实现了二叉树的中序遍历(Inorder Traversal),使用的是迭代的方式。以下是对代码的详细解释:
-
类及方法定义:
- 定义了一个名为
Solution
的类,其中包含一个方法inorderTraversal
,接受一个参数root
,表示二叉树的根节点。
- 定义了一个名为
-
边界条件:
- 首先检查根节点
root
是否为空。如果为空,直接返回一个空的列表,因为没有节点可以遍历。
- 首先检查根节点
-
初始化数据结构:
- 创建一个空的栈
stack
用于存放节点,后续通过这个栈来实现遍历。 - 创建一个空的列表
result
,用于存放中序遍历的结果。 - 设计一个指针
cur
初始化为根节点root
,用来跟踪当前遍历到的节点。
- 创建一个空的栈
-
遍历过程:
- 使用
while
循环,条件是当前节点cur
不为空或栈stack
不为空,确保可以继续遍历。 - 访问左子树:
- 如果
cur
非空,将当前节点cur
压入栈中,并移动到其左子节点cur.left
。
- 如果
- 处理栈顶节点:
- 当
cur
为空时,表示已到达最左边的节点,接下来从栈中弹出节点(即访问当前节点),并将其值添加到结果列表result
中。 - 然后将
cur
更新为刚刚弹出的节点的右子节点cur.right
,以便进一步遍历。
- 当
- 使用
-
返回结果:
- 当循环结束(即没有更多节点可访问时),返回
result
列表,它包含了按中序遍历顺序访问的节点值。
- 当循环结束(即没有更多节点可访问时),返回
总结
这段代码通过栈实现了二叉树的中序遍历。中序遍历的顺序为:先访问左子树,再访问根节点,最后访问右子树。该算法的时间复杂度为 O(n),空间复杂度为 O(h),其中 n 是节点总数,h 是树的高度。