此为自用笔记
首先说下什么叫做完全二叉树
给定的一棵二叉树,如果他是满二叉树,在最后一层,从最右边删除了部分的结点,则符合完全二叉树的条件。即,若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
如上图,给定的二叉树b,最后一行,所有结点不是在最左边,因此不符合成为一棵完全二叉树的条件。
以下给定如何验证是否为完全二叉树的代码
树的存储结构
struct TreeNode{
char data;
TreeNode* lchild;
TreeNode* rchild;
};
判断函数
bool IsWQbinary(TreeNode*T){
if(T == NULL ) return false;
queue<TreeNode*>Q; //定义一个队列存储判断
Q.push(T);
TreeNode* cur;
//循环直到出队的元素为NULL
while(!Q.empty()){
cur = Q.front();
Q.pop();
if(cur == NULL) break;
Q.push(cur->lchild);
Q.push(cur->rchild);
}
//判断最后的队列,如果非全为NULL,则不是一棵完全二叉树
while(!Q.empty()){
if(Q.front() != NULL) return false;
Q.pop();
}
//上述条件均通过,则为完全二叉树
return true;
}
在建树的时候,可以通过前序扩充序列建树,然后验证即可。
附完整可测试代码
#include<iostream>
#include<queue>
using namespace std;
struct TreeNode {
char data;
TreeNode* lchild;
TreeNode* rchild;
};
void Create(TreeNode*& T) {
char x;
cin >> x;
if (x == '#') {
T = NULL;
}
else {
T = new TreeNode();
T->data = x;
Create(T->lchild);
Create(T->rchild);
}
}
// 判断是否为一棵完全二叉树
bool IsWQTree(TreeNode* root) {
if (root == NULL) {
return false;
}
queue<TreeNode*> Q; //TreeNode*
Q.push(root);
TreeNode* cur = NULL;
//用来入队,如果遇到弹出NULL则结束,否则将左右孩子入队
while (!Q.empty()) {
cur = Q.front();
Q.pop();
if (cur == NULL) {
break;
}
Q.push(cur->lchild);
Q.push(cur->rchild);
}
// 遍历剩余的队列,如果存在非NULL,则说明不是完全二叉树
while (!Q.empty()) {
if (Q.front() != NULL)
return false;
Q.pop();
}
return true;
}
int main() {
TreeNode* T;
Create(T);
bool result = IsWQTree(T);
if (result) cout << "是一棵完全二叉树" << endl;
else cout << "不是一棵完全二叉树";
return 0;
}