-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathIsBalancedBinaryTree.java
28 lines (25 loc) · 1.83 KB
/
IsBalancedBinaryTree.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*
* 输入一棵二叉树,判断该二叉树是否是平衡二叉树。
* 平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
* */
public class IsBalancedBinaryTree {
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public boolean isBalanced(TreeNode root) {
return getDepth(root) != -1; //在下面的获取树深度的方法中,如果返回值为-1说明不平衡,为0或者正整数就是平衡
}
private int getDepth(TreeNode root) { //这种方法运用了“剪枝”的思想,即二叉树从底部到顶部递归返回时,每个节点最多只遍历到一次,一旦条件不满足立刻取消遍历,而不是从顶向下每判断一个当前根节点就每次都把下面所有子树节点遍历一遍
if (root == null) return 0; //如果当前根节点为空,深度返回0
int leftDepth = getDepth(root.left); //递归到树底部计算当前根节点左子树的深度,从底向上计算过程中如果发现一处不平衡,直接返回-1,也不会再递归总根节点的右子树
if (leftDepth == -1) return -1;
int rightDepth = getDepth(root.right); //在当前根节点左子树平衡的前提下再递归计算右子树的深度,如果右子树有一处不平衡也直接返回-1,递归结束
if (rightDepth == -1) return -1;
return Math.abs(rightDepth - leftDepth) > 1 ? -1 : Math.max(leftDepth, rightDepth) + 1; //核心的计算树深度的代码,如果当前根节点的左右子树深度相差超过1则不平衡,否则返回当前根节点的深度
}
}