题解 | #判断二叉树是否为平衡二叉树# DFS遍历树判断是否是平衡二叉树

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

http://www.nowcoder.com/practice/f4523caf0205476985516212047ac8e7

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /*
         平衡二叉树:对于任何一个节点来说,他的左右子树高度差不能超过1;

         解题思路:直接DFS遍历每一节点,判断节点的左右子树的高度差。如果超过1,直接不是平衡二叉树。
    */
    public boolean isBalanced (TreeNode root) {
        if(root==null) return true;
        return dfs(root);
    }

    public boolean dfs(TreeNode root){
        // 获取当前节点的左子树高度
        int leftHeight = getHeight(root.left);
        // 获取当前节点的右子树高度 
        int rightHeight = getHeight(root.right);
        // 比较左右子树高度差
        if(Math.abs(leftHeight-rightHeight)>1) return false;

        // 假设左右子树都合法;
        boolean leftSign=true;
        boolean rightSign=true;
        // 递归左子树
        if(root.left!=null){
            leftSign = dfs(root.left);
        }
        // 递归右子树
        if(root.right!=null){
            rightSign = dfs(root.right);
        }

        // 只有当前节点的左右子树都合法,才说明当前节点合法
        if(leftSign && rightSign){
            return true;
        }else{
            return false;
        }
    }

    // 获取一个节点的高度
    public int getHeight(TreeNode root){
        if(root==null) return 0;
        return Math.max(getHeight(root.left),getHeight(root.right))+1;
    }


    // 如果以上代码看得懂!判断平衡二叉树可以简化成这样写。 
  public boolean isBalanced (TreeNode root) {
        // 递归终止条件
         if(root==null) return true;
        
        // 如果当前节点高度差合法, 并且当前节点的左子树是合法 并且 当前节点的右子树是合法
       return Math.abs(getHeight(root.left)-getHeight(root.right))<=1 && isBalanced(root.left) && isBalanced(root.right); }


}

全部评论

相关推荐

09-29 11:19
门头沟学院 Java
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务