平衡二叉树的判断,先序遍历,后序遍历的Java实现

平衡二叉树

http://www.nowcoder.com/questionTerminal/8b3b95850edb4115918ecebdf1b4d222

解法1:
1.计算每个节点的高度
2.从根节点开始从上往下遍历,判断每个节点的左右子树是否是平衡的
思路简单。。。
缺点:每次遍历都要重新计算高度,很多节点的高度都重复计算了

public class Solution {
    public boolean IsBalanced_Solution(TreeNode root) {
        if(root==null)
            return true;
//先判断root节点满不满足平衡条件
        if(Math.abs(TreeDepth(root.left)-TreeDepth(root.right))>1)
            return false;
//在判断左右子树满不满足平衡条件,类似于二叉树的先根遍历
        return IsBalanced_Solution(root.left)&&IsBalanced_Solution(root.right);
    }  
    public int TreeDepth(TreeNode root) {
        if(root == null){
            return 0;
        }
        return Math.max(TreeDepth(root.left), TreeDepth(root.right)) + 1;
    }

}

解法2:
从根节点开始,从上往下遍历,按照中序遍历的思想,从左右子节点向根节点遍历,一依次判断平衡状态,这样根结点可以重复利用已经计算的子节点的高度,只需要依次遍历整棵树。在遇到某个子树非平衡时,能直接结束,返回false。
实现1,这个实现比较巧妙,在遍历每层时创建一个临时变量,参考了C++实现,不过用到了引用传递,但我们都知道Java中Int类型变量传递过程中是值传递,所以创建了一个封装数值的对象。
完整代码如下:

class Num{
    int val;
}
public class Solution {
    boolean IsBalanced_Solution(TreeNode  pRoot) {
        Num depth=new Num();
        return IsBalanced(pRoot,depth);
    }

    boolean IsBalanced(TreeNode  pRoot,Num pDepth){
        if(pRoot==null){
             pDepth.val=0;
            return true;
        }
        Num leftdepth=new Num(),rightdepth=new Num(); //在递归中声明临时变量,用于求父节点传来的指针对应的值。
 //先判断左右子树满不满足平衡条件,同时记录左右子树的深度
       if(IsBalanced(pRoot.left,leftdepth)&&IsBalanced(pRoot.right,rightdepth)){
//再判断根节点满不满足平衡条件,类似于二叉树遍历的后根遍历
            if(Math.abs(leftdepth.val-rightdepth.val)<=1){
                 pDepth.val=leftdepth.val>rightdepth.val?leftdepth.val+1:rightdepth.val+1;
                return true;
            }
        }
        return false;
    }
}

C++的实现如下:

class Solution {
public:
    bool IsBalanced_Solution(TreeNode* pRoot) {
        int depth;
        return IsBalanced(pRoot,&depth);
    }

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

        int leftdepth,rightdepth; //在递归中声明临时变量,用于求父节点传来的指针对应的值。
        if(IsBalanced(pRoot->left,&leftdepth)&&IsBalanced(pRoot->right,&rightdepth)){
            if(abs(leftdepth-rightdepth)<=1){
                *pDepth=leftdepth>rightdepth?leftdepth+1:rightdepth+1;
                return true;
            }
        }
        return false;
    }
};

实现2:

public class Solution {

public boolean IsBalanced_Solution(TreeNode root) {
        return getDepth(root) != -1;
    }

    private int getDepth(TreeNode root) {
        if (root == null) return 0;
        int left = getDepth(root.left);
        if (left == -1) return -1;
        int right = getDepth(root.right);
        if (right == -1) return -1;
        return Math.abs(left - right) > 1 ? -1 : 1 + Math.max(left, right);}
}
全部评论

相关推荐

拉丁是我干掉的:把上海理工大学改成北京理工大学。成功率增加200%
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务