【劍指Offer】:面試題39:平衡二叉樹

整理自劍指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);
    }
};


用一個例子來說明一下遞歸的過程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章