# LeetCode如何檢查二叉樹的平衡性
## 引言
在算法面試和編程競賽中,二叉樹是高頻考點之一。其中,**平衡二叉樹的判斷**更是經典問題,LeetCode上對應題目為[110. Balanced Binary Tree](https://leetcode.com/problems/balanced-binary-tree/)。本文將深入探討該問題的解決方案,包括暴力解法、優化解法以及相關的時間復雜度分析。
---
## 一、問題定義
### 平衡二叉樹的性質
根據題目要求,平衡二叉樹定義為:
> 一個二叉樹每個節點的左右兩個子樹的高度差的絕對值不超過1,并且左右子樹本身也必須是平衡二叉樹。
### 示例
```python
# 平衡二叉樹示例
3
/ \
9 20
/ \
15 7
# 非平衡二叉樹示例
1
/ \
2 2
/ \
3 3
/ \
4 4
def isBalanced(root):
def height(node):
if not node:
return 0
return max(height(node.left), height(node.right)) + 1
if not root:
return True
left_height = height(root.left)
right_height = height(root.right)
return abs(left_height - right_height) <= 1 and \
isBalanced(root.left) and \
isBalanced(root.right)
暴力解法存在重復計算子樹高度的問題。優化思路: 1. 在計算高度的同時判斷平衡性 2. 若子樹不平衡,直接返回-1標記失敗
def isBalanced(root):
def check(node):
if not node:
return 0
left = check(node.left)
right = check(node.right)
if left == -1 or right == -1 or abs(left - right) > 1:
return -1
return max(left, right) + 1
return check(root) != -1
[3]
/ \
[9] [20]
/ \
[15] [7]
計算順序:
1. 9 → 高度1(左右子樹高度0)
2. 15 → 高度1
3. 7 → 高度1
4. 20 → max(1,1)+1=2
5. 3 → max(1,2)+1=3
無返回-1的情況 → 平衡
用例類型 | 示例 | 預期結果 |
---|---|---|
空樹 | None | True |
單節點 | [1] | True |
完全平衡樹 | [1,2,2,3,3,3,3] | True |
最左不平衡 | [1,2,null,3,null,4] | False |
最右不平衡 | [1,null,2,null,3,null,4] | False |
解法類型 | 時間復雜度 | 空間復雜度 | LeetCode運行時間 |
---|---|---|---|
自頂向下 | O(n2) | O(h) | 60ms |
自底向上 | O(n) | O(h) | 40ms |
# 錯誤:未處理子樹不平衡的傳遞
def check(node):
if not node:
return 0
left = check(node.left)
right = check(node.right)
return abs(left - right) <= 1 # 錯誤!只比較了當前節點
關鍵點 | 說明 |
---|---|
平衡定義 | 每個節點的左右子樹高度差≤1 |
最優解法 | 自底向上遞歸,時間復雜度O(n) |
代碼模板 | 高度計算與平衡判斷結合 |
面試技巧 | 應先討論暴力解法再優化 |
進階思考:如何用迭代法實現?可以參考后序遍歷的棧實現方式,但遞歸方案在本題中更為簡潔。
”`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。