题解 | #平衡二叉树#

平衡二叉树

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

解法一、自上而下

这种解法每次都要去计算当前节点的高度,而计算高度的时候又要递归以当前节点为根的树,存在大量的重复计算。

import java.lang.*;
public class Solution {
    public boolean IsBalanced_Solution(TreeNode root) {
        if(root == null){
            return true;
        }
        int leftHeight = getHeight(root.left);
        int rightHeight = getHeight(root.right);
        if(Math.abs(leftHeight - rightHeight) > 1){
            return false;    
        }
        return IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right);
    }
    public int getHeight(TreeNode root){
        if(root == null)
            return 0;
        int leftHeight = getHeight(root.left);
        int rightHeight = getHeight(root.right);
        return 1 + (leftHeight > rightHeight ? leftHeight :rightHeight);
    }
}

解法二、自下而上

从下至上进行计算,每次返回结果的同时带出自己的高度,从而避免了大量的重复计算。

public class Solution {
    public boolean IsBalanced_Solution(TreeNode root) {
        if (root == null)
            return true;
        return bal(root, new int[1]);
    }   
    // 递归辅助函数, h是当前节点的高度,通过它可以返回给父节点自己的高度
    private boolean bal(TreeNode root, int[] h) {
        if (root == null) {
            h[0] = 0;
            return true;
        } else {
            int[] l = new int[1];
            int[] r = new int[1];
            if (!bal(root.left, l) || !bal(root.right, r)) {
                h[0] = l[0] > r[0] ? l[0] + 1 : r[0] + 1;
                return false;
            } else if (l[0] - r[0] > 1 || r[0] - l[0] > 1) {
                h[0] = l[0] > r[0] ? l[0] + 1 : r[0] + 1;
                return false;
            } else {
                h[0] = l[0] > r[0] ? l[0] + 1 : r[0] + 1;
                return true;
            }
        }
    }
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务