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
浙公網安備 33010602011771號