給定一個二叉樹,判斷它是否是高度平衡的二叉樹。
本題中,一棵高度平衡二叉樹定義爲:
一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過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 。
思路:根據平衡二叉樹的定義,遞歸求左右子樹是否是平衡二叉樹即可。遞歸思路三步走,第一步:判斷遞歸終止的條件是啥,第二步遞歸的參數傳啥 第三步……
判斷如果左右子樹不是平衡二叉樹,返回false,如果是判斷這棵樹的高度差是否是平衡二叉樹。
C++代碼如下:
/**
* 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 {
public:
int high(TreeNode* root)
{
int res=0;
if(root)
{
res=max(high(root->left),high(root->right))+1;
}
return res;
}
bool isBalanced(TreeNode* root) {
if(!root) return true;
if(!root->left && !root->right) return true;
if(isBalanced(root->left) && isBalanced(root->right))
{
int lh=high(root->left);
int rh=high(root->right);
if(abs(lh-rh) <=1)
return true;
else
return false;
}
return false;
}
};
不過上面的方法有個明顯的問題,就是遞歸重複太多了,重複計算很多次子樹的高度。有點浪費
所以有下面的方法:
方法是如果我們發現子樹不平衡,則不計算具體的深度,而是直接返回-1。那麼優化後的方法爲:對於每一個節點,我們通過方法遞歸獲得左右子樹的深度,如果子樹是平衡的,則返回真實的深度,若不平衡,直接返回-1,此方法時間複雜度O(N),空間複雜度O(H),參見代碼如下:空間和時間複雜度不是很會算。
/**
* 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 {
public:
int Depth(TreeNode* root) {
if(!root) return 0;
if(!root->left && !root->right) return 1;
int left=Depth(root->left);
if(left == -1) return -1;
int right=Depth(root->right);
if(right == -1) return -1;
int diff=abs(left-right);
if(diff > 1)
return -1;
else
return max(left,right)+1;
}
bool isBalanced(TreeNode* root) {
if(!root) return true;
if(Depth(root) == -1) return false;
else
return true;
}
};
參考: