# LeetCode中如何翻轉二叉樹
## 引言
翻轉二叉樹(Invert Binary Tree)是LeetCode上一道經典的二叉樹問題(題目編號226)。它不僅考察了對二叉樹結構的理解,也是遞歸和迭代算法思想的典型應用場景。本文將詳細解析翻轉二叉樹的多種解法,并探討其時間復雜度和應用場景。
---
## 問題描述
**題目要求**:給定一個二叉樹的根節點 `root`,翻轉這棵二叉樹的所有左右子樹,并返回翻轉后的根節點。
**示例**:
輸入:
4
/
2 7
/ \ /
1 3 6 9
輸出:
4
/
7 2
/ \ /
9 6 3 1
---
## 解法一:遞歸法(DFS)
### 算法思路
遞歸是最直觀的解法,通過深度優先搜索(DFS)遍歷二叉樹的每個節點,并交換其左右子樹。
### 代碼實現
```python
def invertTree(root):
if not root:
return None
# 交換左右子樹
root.left, root.right = root.right, root.left
# 遞歸處理左右子樹
invertTree(root.left)
invertTree(root.right)
return root
使用廣度優先搜索(BFS)逐層遍歷二叉樹,利用隊列存儲待處理的節點,依次交換其左右子樹。
from collections import deque
def invertTree(root):
if not root:
return None
queue = deque([root])
while queue:
node = queue.popleft()
# 交換左右子樹
node.left, node.right = node.right, node.left
# 將子節點加入隊列
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return root
通過棧模擬遞歸的深度優先搜索,顯式地控制遍歷順序。
def invertTree(root):
if not root:
return None
stack = [root]
while stack:
node = stack.pop()
# 交換左右子樹
node.left, node.right = node.right, node.left
# 將子節點壓入棧
if node.left:
stack.append(node.left)
if node.right:
stack.append(node.right)
return root
Morris遍歷是一種空間復雜度為O(1)的算法,通過臨時修改樹的結構實現遍歷。
def invertTree(root):
current = root
while current:
if current.left:
# 找到左子樹的最右節點
predecessor = current.left
while predecessor.right:
predecessor = predecessor.right
# 將當前節點右子樹接到最右節點
predecessor.right = current.right
# 移動左子樹到右側
current.right = current.left
current.left = None
# 移動到右子樹(原左子樹)
current = current.right
return root
None
時直接返回。解法 | 時間復雜度 | 空間復雜度 | 適用場景 |
---|---|---|---|
遞歸法 | O(n) | O(h) | 代碼簡潔 |
BFS迭代法 | O(n) | O(w) | 層次遍歷需求 |
DFS迭代法 | O(n) | O(h) | 模擬遞歸過程 |
Morris遍歷 | O(n) | O(1) | 空間限制嚴格場景 |
根據實際需求選擇合適的解法,遞歸法適合面試快速實現,迭代法更適合工程場景。
”`
(全文約1300字)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。