题意:
给定一个二叉树,确定他是否是一个完全二叉树。
方法一:
bfs
思路:bfs层次遍历树。
步骤:
如果没有左儿子,有右儿子,则不满足完全二叉树;如果有左儿子,则入队;如果有右儿子,则入队,否则置flag=1;(flag为1表示后序的队列元素不能有儿子节点)如果flag==1并且有儿子,则不满足完全二叉树。
class Solution {
public:
bool isCompleteTree(TreeNode* root) {
if(root==nullptr)
return true;
queue<TreeNode*> q;//队列
q.push(root);//入队
int flag=0;
while(!q.empty()){//队列非空
TreeNode* t=q.front();
q.pop();
if(flag==1&&(t->left||t->right))//如果flag==1并且有儿子,则不满足完全二叉树
return false;
if(t->left==nullptr&&t->right)//如果没有左儿子,有右儿子,则不满足完全二叉树
return false;
if(t->left){//如果有左儿子,则入队
q.push(t->left);
}
if(t->right){//如果有右儿子,则入队,否则置flag=1
q.push(t->right);
}else{
flag=1;
}
}
return true;
}
};
时间复杂度:
空间复杂度:![]()
方法二:
dfs
思路:dfs遍历树,并为每个节点标记一个id。
根节点 id 初始化为1,左儿子为 id*2, 右儿子为 id*2+1,
并同时记录数节点的个数 num 。
如果是完全二叉树,则 节点的个数num 会等于 id 的最大值;
否则,说明不是完全二叉树。
class Solution {
public:
unordered_map<int,int> mp;
bool isCompleteTree(TreeNode* root) {
if(root==nullptr)
return true;
int num=dfs(root,1);//递归
for(auto x:mp){
if(x.first>num)//如果id大于节点数量,则说明不是完全二叉树
return false;
}
return true;
}
int dfs(TreeNode* root,int id){//递归,返回子树的节点个数
if(root==nullptr)
return 0;
mp[id]=1;//标记id出现过
return 1+dfs(root->left,id*2)+dfs(root->right,id*2+1);//递归左右儿子
}
};
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号