这道题我一开始的想法是,对于每一个节点,遍历其左右子树,但是这样的方法,是n^2的时间复杂度,更好的我没有想出来,就看了答案。
后序遍历,剪枝
当左右子树差大于2,返回-1,这个-1,用来剪枝,直接结束所有递归。这样对于true,false的判断,就变成了是否为-1的判断。
如果root为null,那么直接返回0,表示所在的能提供的深度为0.
不过这样的计算方式,每个节点得到的是从底向上的深度,而不是从顶向下的,不过不影响解题。
public boolean isBalanced(TreeNode root) {
return recur(root)!=-1;
}
public int recur(TreeNode root){
if(root == null){
return 0;
}
int left = recur(root.left);
if(left == -1) return -1;
int right = recur(root.right);
if(right == -1) return -1;
return Math.abs(left-right)<2?Math.max(left,right)+1:-1;
}