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) {
        // write code here
        if (root == null) return new boolean[]{true, false};

        // 借助两个临时变量充当子节点值和根节点值
        boolean res1 = isBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
        boolean res2 = isFull(root);
        return new boolean[]{res1, res2};
    }

    public boolean isBST(TreeNode root, Long minVal, Long maxVal) {
        if (root == null) return true;
        // 若不满足 BST 的性质,返回 false
        if (root.val <= minVal || root.val >= maxVal) return false;
        // 左边节点值全部小于根节点值,右边全部大于根节点值
        return isBST(root.left, minVal, Integer.toUnsignedLong(root.val)) 
            && isBST(root.right, Integer.toUnsignedLong(root.val), maxVal);
    }

    public boolean isFull(TreeNode root) {
        // 若树为空,不满足完全二叉树的条件,false
        if (root == null) return false;

        Queue<TreeNode> q = new LinkedList<>();
        q.offer(root);
        /*
            算法思路:1. 若左右节点均不为空,将该节点chuduilie
                     2. 若左节点为空,但右节点不为空,false
                     3. 若右节点为空,如左节点不为空,则将该节点添入队列,并将当前节点弹出队列
                     4. 若右节点为空,则之后的节点都必须为叶子节点,才可满足完全二叉树的条件,判断队列是否为空,若非空,咋判断每个节点是否为叶子节点,不满足为 false
                     5. 所有元素出队列后需跳出循环,不然会进入死循环
        */
        while (!q.isEmpty()) {
            int len = q.size();
            for (int i = 0; i < len; i ++) {
                TreeNode tt = q.peek();
                if (tt.left != null && tt.right != null) {
                    q.poll();
                    q.offer(tt.left);
                    q.offer(tt.right);
                } 
                // System.out.print(tt.val + " ");
                else if (tt.left == null && tt.right != null) return false;
                else if (tt.right == null && (tt.left == null || tt.left != null)) {
                    // System.out.print(tt.val + " ");
                    if (tt.left != null) q.offer(tt.left);
                    q.poll();
                    while (!q.isEmpty()) {
                        TreeNode t = q.poll();
//                         System.out.print(t.val + " ");
                        if (t.left != null || t.right != null) return false;
                    }
                    break;
                }
            }
        }
        return true;
    }
}