/**
* 题目
* 给定一个二叉树,确定它是高度平衡的。对于这个问题,一棵高度平衡的二叉树的定义是:
* 一棵二叉树中每个节点的两个子树的深度相差不会超过1。
* 例二叉树:先序 3 9 # # 2 1 # # 7 # # 是平衡二叉树
* 先序 3 # 2 1 # # 7 # # 不是平衡二叉树
* 分析:
* 首先求深度,然后判断深度相差是否超过1,注意递归的使用
*/
import java.util.Scanner;
public class n6BalenceTree {
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeNode treeNode=createTree();
PreTraverse(treeNode);
System.out.println(isBalenced(treeNode));
}
//判断是否平衡
public static boolean isBalenced(TreeNode root){
if(root==null)
return true;
int left=depth(root.left);
int right=depth(root.right);
if(Math.abs(left-right)<=1){
return isBalenced(root.left)&&isBalenced(root.right);
}else
return false;
}
//计算深度
public static int depth(TreeNode root){
if(root==null){
return 0;
}
int left=depth(root.left);
int right=depth(root.right);
return Math.max(left, right)+1;
}
//用先序递归建数
public static TreeNode createTree(){
Scanner input=new Scanner(System.in);
String str=input.nextLine();// 输入一个数字
TreeNode node=null;
if(isNum(str)){//判断是否是数字,则用这个数字为根创建一个结点
node=new TreeNode(Integer.valueOf(str).intValue());
node.left=createTree();
node.right=createTree();
return node;
}
return node;
}
//先序遍历
public static void PreTraverse(TreeNode root){
if(root!=null){
System.out.printf("%4d",root.val);
PreTraverse(root.left);
PreTraverse(root.right);
}else{
System.out.printf("%2c",'#');
}
}
public static boolean isNum(String str){
return str.matches("^[-+]?(([0-9]+)([.]([0-9]+))?([.]([0-9]+))?)$");
}
}