题目
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
树的定义
class TreeNode{
public int n;
public TreeNode left;
public TreeNode rigth;
public TreeNode(int n){
this.n = n;
left = null;
rigth = null;
}
}
思路
思路一
遍历二叉树的每个节点,对以被遍历的节点为根的子树,计算左右子树的深度,判断深度差是否大于1.该算法导致某些节点被重复遍历。时间复杂度高。
思路二
将所有节点只遍历一次的方法。
可以用后序遍历的方法,先遍历左右子树,遍历之后得到左右子树的深度,判断左右子树的高度差是否小于2,并设置该节点的深度。
代码
public static boolean isBalanced(TreeNode root){
int[] n = new int[1];
n[0] = 0;
return isBalanced(root,n);
}
public static boolean isBalanced(TreeNode root,int[] depth){
if(root == null){
depth[0] = 0;
return true;
}
int[] left = new int[1];
int[] right = new int[1];
if(isBalanced(root.left,left) && isBalanced(root.rigth,right)){
int diff =left[0] - right[0];
if(diff <= 1 && diff >= -1){
depth[0] = 1 + (left[0] > right[0] ? left[0] : right[0]);
return true;
}
}
return false;
}
总结
由于java中的int是值传递,而Integer中value的值是final的,所以这里记录子树深度用数组来表示。