整理自劍指Offer
一:題目描述
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。
二:解題思路
如果某二叉樹中任意結點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。
每個結點只遍歷一次的解法:
用後續遍歷的方式遍歷二叉樹的每一個節點,在遍歷到一個結點之前我們已經比遍歷它的左右子樹。只要在遍歷每個結點的時候記錄它的深度(某結點的深度等於它到葉子結點的路徑長度),這樣就可以一邊遍歷一邊判斷每個節點是不是平衡的。
即在遍歷某個節點的左右子結點之後,我們可以根據它左右子結點的深度判斷它是不是平衡的,並且獲得當前節點的深度。
三:代碼實現
class Solution {
public:
bool IsBalanced(TreeNode* pRoot,int& depth){
//如果當前結點是空結點,則它的深度爲0,以它爲根節點的二叉樹是平衡二叉樹,返回true
if(pRoot==NULL){
depth=0;
return true;
}
//如果當前節點不爲空
int left,right; //記錄左右子樹的深度
//判斷其左右子樹是否爲平衡二叉樹
//如果左右子樹均爲平衡二叉樹,記錄左右子樹的深度,判斷當前節點是否滿足平衡二叉樹條件
if(IsBalanced(pRoot->left,left) && IsBalanced(pRoot->right,right)){
int diff=left-right;
if(diff<=1 && diff>=-1){
depth=1+(left>right?left:right);
return true;
}
}
//當前節點不滿足平衡二叉樹的條件
return false;
}
bool IsBalanced_Solution(TreeNode* pRoot) {
if(pRoot==NULL)
return true;
int depth=0;
return IsBalanced(pRoot,depth);
}
};
用一個例子來說明一下遞歸的過程