题目
给定二叉树的根节点root,判断该二叉树是否是完全二叉树。
分析实现
完全二叉树:除了最后一层之外,每一层的节点数都达到了最大值;最后一层的节点从左到右依次排列,没有空缺。
根据完全二叉树的定义可知,对完全二叉树进行层次遍历的时候,若将所有子节点加入队列,则空指针之后不可能会出现非空指针。
据此添加变量meetNull
作为遇见空指针的标志,具体实现如下:
// 判断完全二叉树
bool isComplete(BTNode *root){
if(!root)
return true;
queue<BTNode*> q;
q.push(root);
// 初始化空指针标记为否
bool meetNull=false;
while(!q.empty()){
BTNode *cur=q.front();
q.pop();
if(cur){
// 若cur是meetNull=1后的非空指针,返回否
if(meetNull)
return false;
q.push(cur->left);
q.push(cur->right);
}else{
meetNull=true;
}
}
return true;
}
总结
以上就是判断完全二叉树的实现。
在本题中一个比较新颖的用法就是层次遍历时将空指针也存入辅助队列中,此处需要注意的是,当cur
为空指针时不要再执行q.push(cur->left/right);
。