主要思路
利用二叉树层次遍历的原理开始对二叉树进行层次遍历,特殊点在于遍历的时候将NULL也入队作为标记,如果当遍历到NULL的时候队列中仍然后非NULL元素未被遍历,说明该二叉树中有非空点在空点的右边,即不是完全二叉树。
代码实现
bool is_complete(BiTree biTree) {
queue<BiNode *> q;
BiNode *biNode;
// 进行广度优先遍历(层次遍历),并把NULL节点也放入队列
q.push(biTree);
while ((biNode = q.front()) != NULL) {
q.pop();
q.push(biNode->lchild);
q.push(biNode->rchild);
}
// 判断是否还有未被访问到的节点
while (!q.empty()) {
biNode = q.front();
q.pop();
// 有未访问到的的非NULL节点,则树存在空洞,为非完全二叉树
if (NULL != biNode) {
cout << "不是完全二叉树~" << endl;
return false;
}
}
cout << "是完全二叉树~" << endl;
return true;
}