import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
public class Info {
public boolean isBalanced;
public int maxDepth;
public Info () {
this.isBalanced = true;
this.maxDepth = 0;
}
public Info (boolean isBalanced, int maxDepth) {
this.isBalanced = isBalanced;
this.maxDepth = maxDepth;
}
}
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot TreeNode类
* @return bool布尔型
*/
public boolean IsBalanced_Solution (TreeNode pRoot) {
// write code here
// 1.我要干什么:
// 获知【左子树】中【是否平衡,最大深度多少】
// 获知【右子树】中【是否平衡,最大深度多少】
// 2.我需要什么信息:
// 综上所述,我需要左右子树的【是否平衡,最大深度多少】
// 3.我如何利用两个子树的信息加工出来我的信息:
// 若左右两个子树都平衡,且最大深度相差<=1,则本子树平衡
// 调用递归函数求解
return process(pRoot).isBalanced;
}
public Info process(TreeNode root) {
// 递归出口
if (root == null) {
return new Info();
}
// 从左右子树获取信息
Info leftInfo = process(root.left);
Info rightInfo = process(root.right);
// 根据获取到的信息加工出自己的信息
boolean isBalanced = leftInfo.isBalanced &&
rightInfo.isBalanced &&
(Math.abs(leftInfo.maxDepth - rightInfo.maxDepth) <= 1);
int maxDepth = Math.max(leftInfo.maxDepth, rightInfo.maxDepth) + 1;
return new Info(isBalanced, maxDepth);
}
}