【剑指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);
    }
};


用一个例子来说明一下递归的过程

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