题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
如果某二叉树中的任意节点的左、右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树
练习地址
lc
L - 0110】- e - 平衡二叉树⭐⭐⭐
实现
牛客:链接:https://www.nowcoder.com/questionTerminal/8b3b95850edb4115918ecebdf1b4d222?f=discussion
这种做法有很明显的问题,在判断上层结点的时候,会多次重复遍历下层结点,增加了不必要的开销。如果改为从下往上遍历,如果子树是平衡二叉树,则返回子树的高度;如果发现子树不是平衡二叉树,则直接停止遍历,这样至多只对每个结点访问一次。
public class C55_tree_isBalanced {
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
public static boolean isBalanced(TreeNode root) {
return getDepth(root) != -1;
}
static int getDepth(TreeNode root) {
if (root == null) { return 0; }
int left = getDepth(root.left);
if (left == -1) { return -1; }
int right = getDepth(root.right);
if (right == -1) { return -1; }
return Math.abs(left - right) > 1 ? -1 : 1 + Math.max(left, right);
}
}
Test
public static void main(String[] args) {
TreeNode root=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);
root.left=root2;
root.right=root3;
root2.left=root4;
root2.right=root5;
root5.left=root7;
root3.right=root6;
System.out.println(isBalanced(root));
}