2025/8/20 二叉树的统一迭代法
方法一:空指针标记法
1. 迭代法前序遍历
① 空指针标记法
class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right class Solution: def preorderTraversal(self, root: TreeNode) -> List[int]: if not root: return [] result = [] st = [root] while st: node = st.pop() if node != None: if node.right: st.append(node.right) if node.left: st.append(node.left) st.append(node) st.append(None) else: node = st.pop() result.append(node.val) return result
② 前序遍历写法(推荐写法)
更简单清晰,非空指针标记法
class Solution: def preorderTraversal(self, root: TreeNode) -> List[int]: if not root: return [] result = [] st = [root] while st: node = st.pop() result.append(node.val) if node.right: st.append(node.right) if node.left: st.append(node.left) return st
2.迭代法中序遍历(空指针标记法)
class TreeNode: def __init__(self, val=0, left=None, right=None): self.val=val self.left=left self.right=right class Solution: def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]: if not root: return [] st = [root] result = [] while st: node = st.pop() if node is not None: if node.right: st.append(node.right) st.append(node) st.append(None) if node.left: st.append(node.left) else: node = st.pop() result.append(node.val) return result
3.迭代法后序遍历(空指针标记法)
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]: if not root: return [] result = [] st = [root] while st: node = st.pop() if node is not None: st.append(node) st.append(None) if node.right: st.append(node.right) if node.left: st.append(node.left) else: node = st.pop() result.append(node.val) return result
方法二:boolean标记法
1. 中序遍历,统一迭代(boolean 标记法):
# class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]: values = [] st = [(root, False)] if root else [] while st: node, visited = st.pop() if visited: values.append(node.val) continue if node.right: st.append((node.right, False)) st.append((node, True)) if node.left: st.append((node.left, False)) return values
知识点:
① Python 中 (a, b)
是什么数据结构?
是 Python 中的 元组(tuple),它是一种 不可变的序列类型,类似于 C++ 里的 pair。
特点:
属性 | 说明 |
用圆括号 () 表示 |
(a, b, c) 是一个三元组 |
元素可以不同类型 | (1, "hello", True) |
不可变 | 创建后不能修改其中的值 |
可解包 | a, b = (1, 2) 直接赋值 |
支持索引 | (1, 2)[0] == 1 |
② continue 在这里的作用?
立即跳出本轮 while 循环,进入下一轮循环。
2. 后序遍历,统一迭代(boolean 标记法):
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]: values = [] st = [(root, False)] if root else [] while st: node, visited = st.pop() if visited: values.append(node.val) continue st.append((node, True)) if node.right: st.append((node.right, False)) if node.left: st.append((node.left, False)) return values