完全二叉树的定义(王道):设一棵高度为h,有n个节点的二叉树,当且仅当其中每一个节点都与高度为h的满二叉树编号为1~n的节点一一对应时,称为完全二叉树。下文称呼完全二叉树为CBT。
由定义可知,CBT可以不是满树,但其叶子节点只能出现在最后两层。利用这个性质来判断完全二叉树,使用层序遍历,我们依次将节点入队,而不考虑当前节点的左右孩子节点是否为空而直接入队,这样当我们在出队时发现有空节点,此时判断队列中是否还有非空节点,如果有,则说明此树是CBT。
代码实现:
代码语言:javascript复制#include <queue>
using namespace std;
struct node {
int val;
node *next;
};
bool isCBT(node *root) {
if (!root) return true;
queue<node*> q;
q,push(root);
while (!q.empty()) {
node *top = q.top();q.pop();
if (top) {
q.push(top->left);
q.push(top->right);
} else {
//说明取出的top节点是空节点,此时看队列中是否还有非空节点
while (!q.empty()) {
top = q.top();q.pop();
if (top) return false;
}
}
}
return true;
}