package tree;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;

/**
 * 
给定一棵二叉树,已经其中没有重复值的节点,请判断该二叉树是否为搜索二叉树和完全二叉树。
 */
public class judge {
    public static class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;

        public TreeNode(int val) {
            this.val = val;
        }
    }
    public static void main(String[] args) {
       TreeNode tr=new TreeNode(1);
       tr.left=new TreeNode(2);
       tr.right=new TreeNode(3); 
       tr.left.left=new TreeNode(4);
       tr.left.right=new TreeNode(5);
    //    tr.right.left=new TreeNode(6);
    //    tr.right.right=new TreeNode(7);
       judgeIt(tr);
    }
    /**
     * 
     * @param root TreeNode类 the root
     * @return bool布尔型一维数组
     */
    public static boolean[] judgeIt (TreeNode root) {
        // write code here
        if(root==null){
            return new boolean[2];
        }
        boolean []result=new boolean[2];
        result[0]=judgeSearch(root);
        result[1]=judgeComple(root);
        return result;
    }
    public static boolean judgeSearch (TreeNode root) {
        //判断搜索二叉树
        //中序遍历
        //结果升序是搜索二叉树
        ArrayList<Integer> list=new ArrayList<>();
        helper(root,list);
        ArrayList<Integer> result= (ArrayList<Integer>) list.clone();
        Collections.sort(list);
        for(int i=0;i<list.size();i++){
            if(list.get(i)!=result.get(i)){
                return false;
            }
        }        
        return true;   
    }
    public static void helper (TreeNode root,ArrayList<Integer> list) {
        if(root==null){
            return;
        }
        helper(root.left,list);
        list.add(root.val);
        helper(root.right,list);
        return;
    }
    public static boolean judgeComple(TreeNode root) {
        //判断完全二叉树
        //树为空直接返回false
        //否则层序遍历,如果一个结点左右孩子都不为空,则pop该节点,将其左右孩子入队列;
        //2.1>如果遇到一个结点,左孩子为空,右孩子不为空,则该树一定不是完全二叉树;
        //如果遇到一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空;则该节点之后的队列中的结点都为叶子节点;该树才是完全二叉树,否则就不是完全二叉树
        if(root==null){
            return false;
        }
        Queue<TreeNode> q=new LinkedList<>();
        q.offer(root);
        while(!q.isEmpty()){
            TreeNode t=q.peek();
            int x=q.size();
            if(t.left!=null&&t.right!=null){
                q.poll();
                q.offer(t.left);
                q.offer(t.right);
            }else if(t.left==null&&t.right!=null){
                return false;
            }else if(t.left!=null&&t.right==null||t.left==null&&t.right==null){
                q.poll();
                for(int i=0;i<x;i++){
                    if(q.peek().left!=null||q.peek().right!=null){
                        return false;
                    }
                }
                return true;
            }

            }
        
        return true;
    }

    
}