class Solution {
public:
vector<int> sort; //记录二叉树的中序遍历是否有序
void judgeSBT(TreeNode* root){ //判断是否为搜索二叉树:递归中序遍历
TreeNode* head = root;
if(head == NULL)
return;
judgeSBT(head->left);
sort.push_back(head->val);
judgeSBT(head->right);
}
/*
使用层次遍历
1, 如果当前有右节点,但没有左节点,返回false
2, 如果之前已经出现了没有右节点的节点,后面又出现非叶子节点,返回false
3, 层次遍历,持续压栈
*/
bool judgeCBT(TreeNode* root){ //判断是否为完全二叉树:层次遍历
TreeNode* head = root;
if(head == NULL) {
return true; // 空子树为完全二叉树
}
queue<TreeNode*> que; //队列存储,进行层次遍历
que.push(head);
TreeNode* p;
bool hasNoRightLeaf = false; //记录是否开始出现叶子结点
while(!que.empty()) {
TreeNode *front = que.front();
que.pop();
// 如果当前有右节点,但没有左节点,返回false
if (front->right && !front->left) {
return false;
}
// 如果之前已经出现了没有右节点的节点,后面又出现非叶子节点,返回false
if (hasNoRightLeaf && !(!front->left && !front->right)) {
return false;
}
if (front->left) {
que.push(front->left);
}
if (front->right) {
que.push(front->right);
} else {
hasNoRightLeaf = true;
}
}
return true;
}
vector<bool> judgeIt(TreeNode* root) {
vector<bool> res;
judgeSBT(root);
bool flag = true;
for(int i = 1; i < sort.size(); i++){ //检查是否为递增序列
if(sort[i - 1] > sort[i])
flag = false;
}
res.push_back(flag);
res.push_back(judgeCBT(root));
return res;
}
};