原题链接:平衡二叉树_牛客题霸_牛客网
描述
输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。
在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树
平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
样例解释:
样例二叉树如图,为一颗平衡二叉树
注:我们约定空树是平衡二叉树。
数据范围:,树上节点的val值满足
要求:空间复杂度,时间复杂度
输入描述:
输入一棵二叉树的根节点
返回值描述:
输出一个布尔类型的值
示例1
输入:
{1,2,3,4,5,6,7}
返回值:
true
示例2
输入:
{} 返回值:
true
思路解析:
典型的动态规划的题,每一级节点都都判断两个叶子节点是否符合,如果符合则返回叶子点的层级,然后判断左右叶子节点是否符合平衡二叉树,
代码如下:
public static void main(String[] args) {
Solution solution = new Solution();
TreeNode root1 = new TreeNode(1);
TreeNode root2 = new TreeNode(2);
TreeNode root3 = new TreeNode(3);
TreeNode root4 = new TreeNode(4);
TreeNode root5 = new TreeNode(5);
TreeNode root6 = new TreeNode(6);
TreeNode root7 = new TreeNode(7);
root1.left = root2;
root1.right = root3;
root2.left = root4;
root2.right = root5;
root3.left = root6;
root3.right = root7;
boolean result = solution.IsBalanced_Solution(root1);
System.out.println(result);
}
public boolean IsBalanced_Solution(TreeNode root) {
return isAccordWith(root) != -1;
}
private int isAccordWith(TreeNode node) {
if (node == null) {
return 0;
}
int left = 0;
int right = 0;
if (node.left != null) {
left = isAccordWith(node.left);
}
if (node.right != null) {
right = isAccordWith(node.right);
}
if (left == -1 || right == -1 || Math.abs(left - right) > 1) {
return -1;
}
return (left > right ? left : right) + 1;
}