此为自用笔记

首先说下什么叫做完全二叉树

给定的一棵二叉树,如果他是满二叉树,在最后一层,从最右边删除了部分的结点,则符合完全二叉树的条件。即,若设二叉树的深度为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;
}