题目描述:
图片来源于官方描述。
思路:
// 自己没做出来,看了官方解法。本质上类似树的后序遍历,自底向上来进行判断,采用递归。官方还有解法自顶向下,这样会额外判断,不采纳。
// 核心思想:若一个节点的左子节点是平衡树,右子节点也是。那么我们判断当前节点是不是,当前节点是的前提是左右子节点高度相差小于2。因此我们必须来记录每个节点的树的高度,自己最初想直接在左右子树判断时返回Boolean型,但是这样的话若左右为true,就无法判断当前的true or falsel了。因为左右为true,当前也可以为false,这就必须要求返回各个子节点的树的高度。 同时,若当前已经左边为false,直接一路返回-1即可,无需后续判断了。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
// 自己没做出来,看了官方解法。本质上类似树的后序遍历,自底向上来进行判断。官方还有解法自顶向下,这样会额外判断,不采纳。
// 核心思想:若一个节点的左子节点是平衡树,右子节点也是。那么我们判断当前节点是不是,当前节点是的前提是左右子节点高度相差小于2。因此我们必须来记录每个节点的树的高度,自己最初想直接在左右子树判断时返回Boolean型,但是这样的话若左右为true,就无法判断当前的true or falsel了。因为左右为true,当前也可以为false,这就必须要求返回各个子节点的树的高度。 同时,若当前已经左边为false,直接一路返回-1即可,无需后续判断了。
public boolean isBalanced(TreeNode root) {
return height(root)>=0;
}
public int height(TreeNode root){
if(root==null){
return 0;
}
int lHeight=height(root.left);
if(lHeight==-1){
return -1;
}
int rHeight=height(root.right);
if(rHeight==-1||Math.abs(lHeight-rHeight)>1){
return-1;
}
return Math.max(lHeight,rHeight)+1;
}
}