// Definition for a binary tree node.
import sun.reflect.generics.tree.Tree;
import java.util.*;
class T13 {
public static boolean isBalanced(TreeNode root) {
//判断这个树是否平衡
//广度优先的方式把节点扔到堆栈里面。---》 然后从后出。如果那个不平衡。就干掉。 遍历的同时求height.
//广度优先---队列
LinkedList<TreeNode> t1= new LinkedList<TreeNode>();
t1.add(root);
//需要一个堆栈:
Stack<TreeNode> t2= new Stack<TreeNode>();
while (!t1.isEmpty())
{
TreeNode cur= t1.poll();
//队列弹出。同时添加子节点。
t2.add(cur);
if(cur.left!=null){
t1.add(cur.left);
}
if(cur.right!=null){
t1.add(cur.right);
}
}
//现在t2是一个OK的 堆栈。打印一下吧。
for (TreeNode treeNode : t2) {
System.out.println(treeNode.val);
//校验正确
}
while (!t2.isEmpty())
{
//stack出栈
TreeNode cur =t2.pop(); //peek不删除
//对 cur做啥呢。
int lh=cur.left==null?0:cur.left.height+1;
int rh=cur.right==null?0:cur.right.height+1;
if(Math.abs(lh-rh)>1){
return false;
}
cur.height=Math.max(lh,rh);
}
return true;
}
// 初始化一颗树。
static TreeNode iniTree(int[] t){
//child_info: 0 代表双无 1是有左无右。 2是有右无左。3是双全 。。暂时不想写。
//初始化一棵树。 中左右
TreeNode t1 = new TreeNode();
// while (index.left!=null){
//这是遍历
//
// index= index.left; //找到没有左节点的中节点
//
// }
//初始化。一颗无规律的树。
//用一个队列。把根节点放进去。出栈的时候,分析这个元素要不要子节点。
Queue queue = new LinkedList();
Scanner scan =new Scanner(System.in);
queue.add(t1);//加入首节点
int index =0;// 数组指针
while (index<t.length)
{
//当 数组不为空。
TreeNode cur = queue.poll();
//出栈。
//赋值
cur.val=t[index];
//把当前元素的赋值,并把其子节点放入 queue中
System.out.println(“请输入” + cur.val + “是否有左子节点,0无1有”);
int s= scan.nextInt();
if(1s)
{
cur.left=new TreeNode();
queue.add(cur.left);
}
System.out.println(“请输入” + cur.val + “是否有右子节点,0无1有”);
s= scan.nextInt();
if(1s)
{
cur.right=new TreeNode();
queue.add(cur.right);
}
index++;
}
return t1;
}
public static void main(String[] args) {
// int[] a ={3,9,20,15,7};
int[] a ={1,2,2,3,3,4,4};
TreeNode t1= iniTree(a);
System.out.println(t1.left.right.val);
//现在要判断它是不是 平衡的。
//思路, 广度优先的方式,把所有节点放到堆栈里面.然后从后求此节点的深度。如果深度不等于-1 那么等于他的子节点的深度。如果没有那么为1
//求深度的过程,顺便返回是否平衡。
boolean ans= isBalanced(t1);
System.out.println(ans);
//写不动了 不强求。明天写。
//
// Stack stack= new Stack();
//
// stack.add(t1);
//
// while (!stack.isEmpty())
// {
// cur = stack.
//
//
// }
}
static class TreeNode {
int val;
int height;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
}