平衡二叉树就是AVL树,定义也很简单,就是一棵树的每一个节点的左右子树高度相差不超过1。AVL树具有数组和链表的优点,方便查找也方便插入,时间复杂度仅为O(height),height就是树的高度,所以为什么需要平衡二叉树就显而易见了,就是效率!!
那么如何判断一棵树是否是平衡的呢,使用递归可以很好很方便地解决这个问题,
public class C05_BalanceTree {
public static class Node{
public int value;
public Node left;
public Node right;
public Node(int value){
this.value = value;
}
}
//判断是否平很
public static boolean isBalance(Node head){
int i = process(head);
return (i==-1||i>1)?false:true;
}
//递归解决
public static int process(Node cur){
if(cur==null){
return 0;//0表示平衡
}
/*
* 左子树是否平衡,右子树是否平衡,
* 都平衡的情况下,左右子树是否平衡
* 以上三种情况都平衡,返回什么
*/
int leftData = process(cur.left);
if(!isBalance(cur.left)){//如果左子树不平衡,直接返回-1
return -1;
}
int rightData = process(cur.right);
if(!isBalance(cur.right)){//如果右子树不平衡,返回-1
return -1;
}
if(Math.abs(leftData-rightData)>1){//左右子树是否平衡
return -1;
}
//到这里就是平衡的了,返回cur的左右子树的最大值+1
return Math.max(leftData, rightData)+1;
}
public static void main(String[] args) {
Node head = new Node(1);
head.right = new Node(1);
head.right.right = new Node(1);
head.right.right.right = new Node(1);
System.out.println(isBalance(head));
}
}