题目描述
平衡二叉树的性质为: 要么是一棵空树,要么任何一个节点的左右子树高度差的绝对值不超过 1。给定一棵二叉树,判断这棵二叉树是否为平衡二叉树。
一颗树的高度指的是树的根节点到所有节点的距离中的最大值。
输入描述:
第一行输入两个整数 n 和 root,n 表示二叉树的总节点个数,root 表示二叉树的根节点。
以下 n 行每行三个整数 fa,lch,rch,表示 fa 的左儿子为 lch,右儿子为 rch。(如果 lch 为 0 则表示 fa 没有左儿子,rch同理)
输出描述:
如果是平衡二叉树则输出 “true”,否则输出 “false”。
示例1
输入
3 2
1 2 3
输出
true
解法一:自己写的
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
br.readLine();
TreeNode root = createTree(br);
boolean res = judge(root);
System.out.println(res);
}
public static boolean judge(TreeNode root){
if(root==null) return true;
if(root.left==null&&root.right==null) return true;
boolean flag = judge(root.left);
if(flag==false) return false;
flag = judge(root.right);
if(flag==false) return false;
int left = height(root.left);
int right = height(root.right);
return Math.abs(left-right)>1?false:true;
}
public static int height(TreeNode root){
if(root==null) return 0;
int left = height(root.left);
int right = height(root.right);
return Math.max(left,right)+1;
}
//递归建树
public static TreeNode createTree(BufferedReader br){
try{
String[] ss = br.readLine().trim().split(" ");
int data = Integer.parseInt(ss[0]);
int left = Integer.parseInt(ss[1]);
int right = Integer.parseInt(ss[2]);
TreeNode root = new TreeNode(data);
if(left!=0){
root.left = createTree(br);
}
if(right!=0){
root.right = createTree(br);
}
return root;
}catch(Exception e){
return null;
}
}
}
class TreeNode{
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val){
this.val = val;
}
}
解法二:试试树形dp的套路
思路:
1.列出可能性
2.找出判断结果需要的信息
3.定义返回结果
3.设计递归,左右子树结果直接递归求的
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
br.readLine();
TreeNode root = createTree(br);
boolean res = judge(root).isBalanced;
System.out.println(res);
}
public static ResultType judge(TreeNode root){
if(root==null){
return new ResultType(true,0);
}
ResultType left = judge(root.left);
if(left.isBalanced==false) return new ResultType(false,-1);
ResultType right = judge(root.right);
if(left.isBalanced==false) new ResultType(false,-1);
return new ResultType(Math.abs(left.height-right.height)<2,Math.max(left.height,right.height)+1);
}
//递归建树
public static TreeNode createTree(BufferedReader br){
try{
String[] ss = br.readLine().trim().split(" ");
int data = Integer.parseInt(ss[0]);
int left = Integer.parseInt(ss[1]);
int right = Integer.parseInt(ss[2]);
TreeNode root = new TreeNode(data);
if(left!=0){
root.left = createTree(br);
}
if(right!=0){
root.right = createTree(br);
}
return root;
}catch(Exception e){
return null;
}
}
}
class ResultType{
boolean isBalanced;
int height;
public ResultType(boolean isBalanced,int height){
this.isBalanced = isBalanced;
this.height = height;
}
}
class TreeNode{
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val){
this.val = val;
}
}