平衡二叉树

题目描述

输入一棵二叉树,判断该二叉树是否是平衡二叉树。

平衡二叉树

一棵空树或它的任意节点的左右两个子树的高度差的绝对值均不超过1。

思路一

递归遍历每个节点,判断左右子树的高度差,但是会出现重复遍历的情况

public class Solution {
    //中序遍历求树的深度
    public int treeDepth(TreeNode root){
        if(root == null) return 0;
        int leftLen = treeDepth(root.left);
        int rightLen = treeDepth(root.right);
        return leftLen > rightLen ? leftLen +1 : rightLen + 1;
    }

    public boolean IsBalanced_Solution(TreeNode root) {
        if(root == null) return true;
        //每遍历到一个节点就以该节点为根节点,求其左右孩子的深度(有重复)
        int leftDep = treeDepth(root.left);
        int rightDep = treeDepth(root.right);
        int diff = leftDep - rightDep;
		//任何一个节点的左右孩子的高度差大于1,那么就返回false
        //这里不能通过判断Math.abs(diff) < 1就返回true,因为可能孩子的左右孩子的高度差大于1
        if(Math.abs(diff) > 1){
            return false;
        }
        return IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right);
    }
}

思路二

重载IsBalanced_Solution方法,添加一个holder参数,表示当前作为root的节点

public class Solution {
    public boolean IsBalanced_Solution(TreeNode root) {
        return IsBalanced_Solution(root,new Holder());
    }

    //添加一个类Holder持有当前的节点,并定义一个当前节点的深度
    private class Holder {
        int depth;
    }

    public boolean IsBalanced_Solution(TreeNode root, Holder holder){
        if(root == null){
            holder.depth =0;
            return true;
        }
        Holder leftHolder = new Holder();
        Holder rightHolder = new Holder();

        boolean bLeft = IsBalanced_Solution(root.left, leftHolder);
        boolean bRight = IsBalanced_Solution(root.right, rightHolder);

        int lDepth = leftHolder.depth;
        int RDepth = rightHolder.depth;

        if(bLeft && bRight){
            if(Math.abs(lDepth - RDepth) > 1){
                return false;
            }
            holder.depth += (lDepth > RDepth ? lDepth + 1 : RDepth + 1);
            return true;
        }
        return false;
    }


}

c语言版用于对比Java和c语言在处理depth的差异所在,但是总的思想都是一样的:采用后序遍历的方式遍历二叉树的每一个节点,在遍历到一个节点之前我们就已经遍历了它的左右字树。此时,记录每个节点为根节点的树的高度,就可以一边遍历一边判断每个节点是不是平衡的。

bool IsBalanced(BinaryTreeNode* pRoot, int* depth){  
    if(pRoot== NULL){  
        *depth = 0;  
        return true;  
    }  

    int nLeftDepth,nRightDepth;  
    bool bLeft= IsBalanced(pRoot->m_pLeft, &nLeftDepth);  
    bool bRight = IsBalanced(pRoot->m_pRight, &nRightDepth);  

    if (bLeft && bRight){  
        int diff = nRightDepth-nLeftDepth;  
        if (diff<=1 && diff>=-1) //左右字树高度差绝对值不超过1  
        {  
            *depth = 1+(nLeftDepth > nRightDepth ? nLeftDepth : nRightDepth);  
            return true;  
        }  
    }   
    return false;  
}  

bool IsBalanced(BinaryTreeNode* pRoot)  
{  
    int depth = 0;  

    return IsBalanced(pRoot, &depth);  
}  

参考:

判断二叉树是否为平衡二叉树

posted @ 2019-04-11 10:19  crr121  阅读(149)  评论(0编辑  收藏  举报