/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类 the root
* @return bool布尔型vector
*/
vector<int> res; // 将二叉树以中序遍历压入数组res,如果是搜搜二叉树的话,res将以升序排列
void searchTree(TreeNode* root) {
if(root==nullptr)
return;
searchTree(root->left);
res.push_back(root->val);
searchTree(root->right);
}
bool fullTree(TreeNode* root) { // 如果二叉树左子树子节点的数量小于右子树,则不是完全二叉树
if(root == nullptr || (root->left == nullptr && root->right == nullptr))
return true;
int left = numTree(root->left);
int right = numTree(root->right);
if(left < right)
return false;
return fullTree(root->left) && fullTree(root->right);
}
int numTree(TreeNode* root) { // 计算每个二叉树子节点的数量
if(root == nullptr)
return 0;
int left = numTree(root->left);
int right = numTree(root->right);
return left + right + 1;
}
vector<bool> judgeIt(TreeNode* root) {
// write code here
vector<bool> ans; // 最后答案
searchTree(root); // 判断二叉树是不是搜索二叉树
bool fullT = fullTree(root); // 判断二叉树是不是完全二叉树
bool searchT = true;
if(res.size() < 2)
searchT = true;
int pre = res[0];
for(int i = 1; i < res.size(); i++) {
if(res[i] < pre) {
searchT = false;
break;
}
pre = res[i];
}
ans.push_back(searchT);
ans.push_back(fullT);
return ans;
}
};