遍历顺序可以看作访问中间节点的顺序
- 前序遍历:中间节点 --> 左子树 --> 右子树
- 中序遍历:左子树 --> 中间节点 --> 右子树
- 后序遍历:左子树 --> 右子树 --> 中间节点
二叉树前序遍历(Leetcode 144)
利用栈后进先出,先将左孩子入栈,再将右孩子入栈,最后入栈中间节点,当节点为空时,依次出栈
def preorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
stack = [(root, 0)]
ret = []
while stack:
cur, flag = stack.pop()
if flag == 0: # flag=0: 未被访问过
if cur.right:
stack.append((cur.right, 0))
if cur.left:
stack.append((cur.left, 0))
stack.append((cur, 1))
else:
ret.append(cur.val)
return ret
# 因为先弹出中间节点,可以简化为以下代码
def preorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
stack = [root]
res = []
while stack:
cur = stack.pop()
res.append(cur.val)
if cur.right:
stack.append(cur.right)
if cur.left:
stack.append(cur.left)
return res
二叉树中序遍历(Leetcode 94)
思路同上,只需将压入栈的顺序改为右中左
def inorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
stack, res = [(root, 0)], []
while stack:
cur, flag = stack.pop()
if flag == 0:
if cur.right:
stack.append((cur.right, 0))
stack.append((cur, 1))
if cur.left:
stack.append((cur.left, 0))
else:
res.append(cur.val)
return res
二叉树后序遍历(Leetcode 145)
思路同上,只需将压入栈的顺序改为中右左
def postorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
stack = [(root, 0)]
ret = []
while stack:
cur, flag = stack.pop()
if flag == 0: # flag=0: 未被访问过
stack.append((cur, 1))
if cur.right:
stack.append((cur.right, 0))
if cur.left:
stack.append((cur.left, 0))
else:
ret.append(cur.val)
return ret
So easy !