这题比较简单,层序遍历的基础上,做一些判断就可以。
原题传送门
【题目描述】
【示例】
【解题过程】
【思路】
首先进行层序遍历,当发现某个结点有右儿子但没有左儿子,返回false,当发现一个结点少一个子节点,如果flag为0,就将flag标记为1,当有子节点,则需要判断flag是否为1,如果是1,说明前面有空缺,这不是完全的二叉树,返回false。遍历完了之后说明没有发现问题,这是完全二叉树,返回true。
【代码】
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool isCompleteTree(TreeNode* root) {
if(root==nullptr){
return true;
}
queue<TreeNode*> que;
que.push(root);
int len=que.size();
int flag=0;
while(!que.empty()){
len=que.size();
for(int i=0;i<len;i++){//对当前层的每一个结点
root=que.front();
if(root->left==nullptr && root->right!=nullptr){//有右儿子但没有左儿子,不完全
return false;
}
if((root->left!=nullptr) && flag==0){//有左儿子,flag==0,加入
que.push(root->left);
}
else if((root->left==nullptr) && flag==0){//没有左儿子,flag==0,标记空缺
flag=1;
}
else if((root->left!=nullptr) && flag==1){//有左儿子,但是之前有过空缺,说明数不完全,返回false
return false;
}
//右儿子同理
if((root->right !=nullptr) && flag==0){
que.push(root->right);
}
else if((root->right ==nullptr) && flag==0){
flag=1;
}
else if((root->right !=nullptr) && flag==1){
return false;
}
que.pop();
}
}
//树遍历完成,没有发现问题,返回true。
return true;
}
};
运行结果: