思路:
按照“左子树->根节点->右子树”的顺序遍历二叉树结点,并将节点的值储存在列表中返回。
首先,我们定义了两个常量“WHITE”和“GRAY”,用来表示节点的状态,“WHITE”表示节点未被访问过,“GRAY”表示节点已经被访问过但其子节点还未被访问。
然后,我们创建一个空列表“res”用于储存遍历的结果,以及一个站“stack”用于辅助遍历。将根节点和初始状态“WHITE”入栈。
接下来我们进入循环,只要栈不空,就继续循环。在循环中,我们从栈顶部弹出一个节点和其对应的状态。
如果节点为空,表示已经到达叶子节点或空节点,直接跳过。
如果节点为“WHITE”,表示该节点还未被处理,按照“左中右”的顺序处理当前节点:首先,将右子节点和当前节点重新入栈,并将当前的状态置为“GRAY”,然后再将左子节点入栈。
如果节点状态为“GRAY”,表示左子树已经处理完毕,将当前节点的值加入到结果列表中。
最终,当栈为空时,说明表里完成,返回结果列表“res”即可。这样就完成了二叉树的中序遍历
题解:
class Solution:
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
# 定义颜色常量,WHITE表示未访问过的节点,GRAY表示已访问过的节点
WHITE, GRAY = 0, 1
# 用于存储中序遍历结果的列表
res = []
# 使用栈来模拟递归过程,初始时将根节点入栈,并标记为WHITE
stack = [(WHITE, root)]
while stack:
color, node = stack.pop()
# 如果当前节点为空,直接跳过
if node is None:
continue
if color == WHITE:
# 如果节点为白色,说明未处理过其左子树,按照左中右的顺序入栈
stack.append((WHITE, node.right))
stack.append((GRAY, node))
stack.append((WHITE, node.left))
else:
# 如果节点为灰色,说明左子树已经处理完毕,将当前节点的值加入结果列表
res.append(node.val)
return res