剑指OFFER——判断一棵树是否是平衡二叉树 java实现
题目描述:输入一棵二叉树,判断该二叉树是否是平衡二叉树。
题目解析:首先要明白平衡二叉树的性质才做判断:平衡二叉树就是左子树和右子树的高度差不能超过1,且左右子树必须是平衡二叉树;
解决方法1:从根节点开始,先判断左右子树的高度差是否超过1,然后接着判断左右子树是否是平衡二叉树。这边用到了递归思想。
代码如下:
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
if( root == null) { //一棵空树就是平衡二叉树
return true;
}
if( Math.abs(getDepth(root.left) - getDepth(root.right)) <= 1 ) {
//满足左右子树高度差小于等于1,那就接着判断左右子树是不是二叉树
return (IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right));
} else {
//不满足左右子树高度差小于等于1,那这棵树肯定不是平衡二叉树啦
return false;
}
}
public int getDepth(TreeNode root) {
if( root == null ) return 0;
int left = getDepth(root.left);
int right = getDepth(root.right);
return ( left > right ? left : right ) + 1;//树的高度怎么计算就不用我讲了吧
}
}
OK!上面就是利用递归思想来判断一棵树是不是平衡二叉树的,但是,有一个缺陷,就是每判断一棵树就要遍历一遍树种的节点;来计算树的高度,这样下来,整个判断过程,每个节点不止被遍历过一次了。我们想想有没有其他办法可以让所有节点可以只遍历一次。比如说,一棵树只要知道他左右子树的深度以及左右子树是不是平衡二叉树就可以判定这棵树是不是平衡二叉树了。上面这种方法是从根节点遍历到叶子节点,那如果我们从叶子节点开始遍历,一层一层往上遍历,那不就实现了每个节点只遍历一次了吗?
好,思路开始形成了,我们要先遍历左右子树,再左右子树组成的这颗树是不是平衡二叉树。这不就是后序遍历吗!!!这也就是解法二的思想
解法二:
代码如下:
public class Solution {
private boolean isBalanced = false;//最后的返回值
public boolean IsBalanced_Solution(TreeNode root) {
getDepth(root);
return isBalanced;
}
public int getDepth(TreeNode root) {
if(root == null) {
isBalanced = true;
return 0;
}
int left = getDepth(root.left);//左子树
int right = getDepth(root.right);//右子树
int depth = (left > right ? left : right) + 1;
if(Math.abs(left - right) <= 1) {
isBalanced = true;
} else {
isBalanced = false;
}
return depth;//下层的深度,上层可以接着用免得再遍历
}
}