问题

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

示例 1:

给定二叉树

graph TD
    A[3] --> B[9]
    A --> C[20]
    B --> D[ ]
    B --> E[ ]
    C --> F[15]
    C --> G[7]
    
    style D fill:transparent,stroke:transparent
    style E fill:transparent,stroke:transparent

返回 示例 2:

给定二叉树

graph TD
    A[1] --> B[2]
    A --> C[2]
    B --> D[3]
    B --> E[3]
    C --> F[ ]
    C --> G[ ]
    D --> H[4]
    D --> I[4]
    
    style F fill:transparent,stroke:transparent
    style G fill:transparent,stroke:transparent

返回

解法

深度优先搜索,首先获取左右子树的深度,判断相差是否小于1,然后递归左右子树即可,需要注意的一点是获取左右子树深度的时候需要+1

代码

java

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isBalanced(TreeNode root) {
        if(root == null) {
            return true;
        }
        //获取左子树的深度
        int left = dfs(root.left);
        //获取右子树的深度
        int right = dfs(root.right);
        
        //判断左右子树深度差 递归调用左右子树。
        return Math.abs(left-right) <=1 &&  isBalanced(root.left) && isBalanced(root.right);
    }
    //获取树的深度
    private int dfs(TreeNode root) {
        if(root == null) {
            return 0;
        }
        int left = dfs(root.left);
        int right = dfs(root.right);
        //左右深度+1的最大值。
        return Math.max(left, right) + 1;
    }
}