/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 the root
     * @return bool布尔型vector
     */
    vector<bool> judgeIt(TreeNode* root) {
        // write code here
        return {isSearchTree(root,INT_MIN,INT_MAX),isCompletedTree(root)};
    }
    
    bool isCompletedTree(TreeNode* root)
    {
        if(root == nullptr) 
            return true;
        if(root->left && root->right == nullptr)
            return isCompletedTree(root->left);
        if(root->left == nullptr && root->right)
            return false;
        return isCompletedTree(root->left) && isCompletedTree(root->right);
    }
    
    bool isSearchTree(TreeNode *root, int left, int right)
    {
        if(root == nullptr) 
            return true;
        if(root->val < left || root->val > right)
            return false;
        return isSearchTree(root->left,left,root->val) && isSearchTree(root->right, root->val,right);
    }
        
};