题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
思路与实现
way1
平衡二叉树左右子树深度差值不超过1。求左右子树的深度,判断差值,不超过1则为平衡二叉树。
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
if (root == null)
return true;
int left = TreeDepth(root.left);
int right = TreeDepth(root.right);
int minusabs = Math.abs(left - right);
if (minusabs <= 1)
return true;
return false;
}
public int TreeDepth(TreeNode root) {
if (root == null)
return 0;
int left = TreeDepth(root.left);
int right = TreeDepth(root.right);
return Math.max(left,right)+1;
}
}
way2(剑指offer)
方法1会重复遍历结点,性能较差。
改进:后序遍历的方式遍历整颗二叉树,遍历到某结点的左右子结点时,根据左右结点的深度判断是不是平衡的,并得到当前结点的深度。当遍历到根节点的时候就判断了整颗二叉树是不是平衡二叉树。
public class Solution {
private boolean isBalanced = false;//最后的返回值
public boolean IsBalanced_Solution(TreeNode root) {
if (root == null)
return true;
getDepth(root);
return isBalanced;
}
public int getDepth(TreeNode root) {
if (root == null)
return 0;
int left = getDepth(root.left);//左子树
int right = getDepth(root.right);//右子树
int depth = Math.max(left, right) + 1;
if (Math.abs(left - right) <= 1) {
isBalanced = true;
} else {
isBalanced = false;
}
return depth;//下层的深度,上层可以接着用免得再遍历
}
}