題目
給定一個二叉樹,判斷它是否是高度平衡的二叉樹。
本題中,一棵高度平衡二叉樹定義爲:
一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1。
示例 1:
給定二叉樹 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回 true
。
示例 2:
給定二叉樹 [1,2,2,3,3,null,null,4,4]
1
/ \
2 2
/ \
3 3
/ \
4 4
返回 false
。
思路
平衡子樹暗示了一個事實,每棵子樹也是一個子問題。
現在的問題是:按照什麼順序處理這些子問題?
定義遞歸函數 height
,用於計算任意一個節點 p
∈ T
的高度。
height(p
)的計算方法:
1.
如果 p 是一棵空樹,就返回 -1。
2.
如果不滿足1.
,遞歸調用自身,返回1+max(height(p.left),height(p.right))
接下來就是比較每個節點左右子樹的高度。在一棵以 r
爲根節點的樹 T
中,只有每個節點左右子樹高度差不大於 1 時,該樹纔是平衡的。因此可以比較每個節點左右兩棵子樹的高度差,然後向上遞歸。
值得一提的是,如果樹爲空,也符合平衡樹的定義。
代碼:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
int height(TreeNode* root) {
if (root == NULL) return -1; //如果是一棵空樹,就返回 -1。
else return 1 + max(height(root->left), height(root->right));
}
public:
bool isBalanced(TreeNode* root) {
if(root == NULL) return true; //該樹爲空,則符合平衡樹的定義
return abs(height(root->left) - height(root->right)) < 2 &&
isBalanced(root->left) &&
isBalanced(root->right);
}
};