题意:
给定一个二叉树,确定他是否是一个完全二叉树。
方法一:
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);//递归左右儿子 } };
时间复杂度:空间复杂度: