需求:
给定一个二叉树,确定它是高度平衡的。对于这个问题,一棵高度平衡的二叉树的定义是:一棵二叉树中每个节点的两个子树的深度相差不会超过1。
分析:
平衡二叉树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,同时,平衡二叉树必定是二叉搜索树,反之则不一定。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci(斐波那契)数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。
根据定义,可知判断条件为:
如果二叉树根是空的,那么肯定是平衡二叉树;如果根不是空的,那么需要保证其左右子树都是平衡二叉树,并且左右子树的深度之差应该小于等于1。因此需要使用递归和分治算法。
代码:
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/*
* @param root: The root of binary tree.
* @return: True if this Binary tree is Balanced, or false.
*/
public boolean isBalanced(TreeNode root) {
// write your code here
if(root == null){
return true;
}
//判断左右子树是否是平衡的并且深度差值是否小于等于1
if(isBalanced(root.left) && isBalanced(root.right) && Math.abs(maxDepth(root.left)-maxDepth(root.right))<=1){
return true;
}
return false;
}
//求二叉树深度
public int maxDepth(TreeNode root){
if(root == null){
return 0;
}
//初始化深度1
int depth = 1;
//求左右子树的深度
int ld = maxDepth(root.left);
int rd = maxDepth(root.right);
return Math.max(ld, rd)+depth;
}
}