import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {

    /**
     * 
     * @param root TreeNode类 the root
     * @return bool布尔型一维数组
     */
    public boolean[] judgeIt (TreeNode root) {
        boolean[] result = new boolean[2];

        result[0] = isTwoSearchTree(root, null, null);

        result[1] = isFullTree(root);

        return result;
    }

    // 是否为二叉搜索树
    public boolean isTwoSearchTree(TreeNode root, Integer min, Integer max){

        if (root == null) {
            return true;
        }

        // 如果root值小于最低项则不是搜索二叉树
        if (min != null && root.val <= min) {
            return false;
        }

        // 如果root值大于最高项,也不是二叉搜索树
        if (max != null && root.val >= max) {
            return false;
        }

        boolean leftFlg = isTwoSearchTree(root.left, min, root.val);
        boolean rightFlg = isTwoSearchTree(root.right, root.val, max);

        return leftFlg && rightFlg;
    }


    // 验证是否为完全二叉树
    public boolean isFullTree(TreeNode root){

        if(root == null){
            return false;
        }

        LinkedList<TreeNode> queue = new LinkedList();
        queue.offer(root);

        while(!queue.isEmpty()){

            TreeNode temp = queue.poll();

            if (temp != null) {
                queue.offer(temp.left);
                queue.offer(temp.right);
            } else {

                // 如果节点为nul,则去判断后面的节点中是否还存在不为null,
                // 如果还存在不为null的节点,则不是完全二叉树
                // 因为完全二叉树,要么叶子节点都是满的,要么都聚集在左节点上,所以聚集在左节点上,所有的null都在最后面。
                while (!queue.isEmpty()) {

                    TreeNode leafNode = queue.poll();

                    if (leafNode != null) {
                        return false;
                    }
                }
            }
        }

        return true;
    }
}