给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回 true
。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
1
/ \
2 2
/ \
3 3
/ \
4 4
返回 false
。
这个题目让我对递归的思路理解地更深刻了,评论区有一个大佬的博客写关于递归的写得很好
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
class Solution {
/*
* 写递归关注到的三点:
* 1.中止条件是什么
* 2.本级递归要做什么
* 3.返回给上一级的是什么
* 首先思考中止条件,当递归到空节点时停止,这是一颗平衡二叉树,那么返回的值是什么,是你在
* 递归要用的的东西,也就是左右子树的高度以及左右子树是不是平衡二叉树
* 因此构建一个新的类保存这两个数值
* 1和3搞懂,接下来是2,本级递归要做的就是根据返回值来判断以当前节点为根节点的树是不是平衡
* 二叉树,通过了判断就计算高度
*/
class Node{
public int depth;
public boolean isB;
public Node(int depth, boolean isB) {
this.depth = depth;
this.isB = isB;
}
}
public boolean isBalanced(TreeNode root) {
return isBST(root).isB;
}
public Node isBST(TreeNode root) {
if(root == null) {
return new Node(0, true);
}
Node left = isBST(root.left);
Node right = isBST(root.right);
/*
* 判断一棵树是不是平衡二叉树,有以下条件
* 1.左子树或右子树不是平衡二叉树,那么这棵树不是平衡二叉树
* 2.左右字数高度差大于1,不是平衡二叉树
*/
if(!(left.isB && right.isB)) {
return new Node(0, false);
}
if(Math.abs(left.depth - right.depth) > 1) {
return new Node(0, false);
}
return new Node(Math.max(left.depth, right.depth)+1, true);
}
}