# 如何返回Python二叉樹的后序遍歷
## 引言
二叉樹的后序遍歷(Postorder Traversal)是一種經典的深度優先遍歷算法,其訪問順序遵循"左子樹→右子樹→根節點"的規則。本文將詳細講解在Python中實現二叉樹后序遍歷的多種方法,包括遞歸法、迭代法以及Morris遍歷算法,并通過代碼示例和復雜度分析幫助讀者深入理解。
---
## 一、二叉樹后序遍歷的定義
后序遍歷的順序為:
1. 遍歷左子樹
2. 遍歷右子樹
3. 訪問根節點
示例二叉樹:
1
/ \
2 3
/
4 5
后序遍歷結果:`[4, 5, 2, 3, 1]`
---
## 二、遞歸實現
遞歸是最直觀的實現方式,直接反映遍歷定義。
### 代碼實現
```python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def postorderTraversal(root: TreeNode) -> list:
def dfs(node, res):
if not node:
return
dfs(node.left, res) # 左子樹
dfs(node.right, res) # 右子樹
res.append(node.val) # 根節點
result = []
dfs(root, result)
return result
通過顯式棧模擬遞歸過程,避免遞歸的系統開銷。
def postorderTraversal(root: TreeNode) -> list:
if not root:
return []
stack = [root]
result = []
while stack:
node = stack.pop()
result.append(node.val)
# 注意入棧順序:先左后右 → 出棧順序變為右左
if node.left:
stack.append(node.left)
if node.right:
stack.append(node.right)
return result[::-1] # 反轉得到后序
def postorderTraversal(root: TreeNode) -> list:
stack = [(root, False)]
result = []
while stack:
node, visited = stack.pop()
if not node:
continue
if visited:
result.append(node.val)
else:
# 入棧順序與訪問順序相反
stack.append((node, True))
stack.append((node.right, False))
stack.append((node.left, False))
return result
無需額外空間的高效算法,通過修改樹結構實現。
def postorderTraversal(root: TreeNode) -> list:
result = []
dummy = TreeNode(0)
dummy.left = root
current = dummy
while current:
if not current.left:
current = current.right
else:
pre = current.left
while pre.right and pre.right != current:
pre = pre.right
if not pre.right:
pre.right = current # 建立臨時鏈接
current = current.left
else:
pre.right = None # 恢復樹結構
# 記錄左子樹到pre的路徑
temp = current.left
nodes = []
while temp:
nodes.append(temp.val)
temp = temp.right
result += nodes[::-1]
current = current.right
return result
方法 | 優點 | 缺點 |
---|---|---|
遞歸 | 代碼簡潔 | 棧溢出風險 |
迭代(雙棧) | 無需遞歸 | 需要反轉結果 |
迭代(標記) | 邏輯清晰 | 額外標記位 |
Morris | 空間最優 | 修改原始結構 |
[1,null,2,3]
,手動計算其后序遍歷”`
(全文約1150字)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。