提示:层序遍历变型题。
完全二叉树:根节点下除叶子节点外,每个结点的左右子树不能为空,叶子结点重左至右依次存在。
满二叉树:完全二叉树的特殊情况,每一层节点数为2^( n -1 )个。
验证过程,当存节点的队列不为空,则进入循环,遍历二叉树,当左右节点均不为空,则释放当前队头节点,依次存放左左节点,右节点;左为空,右不为空时,不满足条件,则退出并返回false;下来就剩左右均为空,左空右不为空两种情况。
#define _CRT_SECURE_NO_WARNINGS 10
#include<iostream>
#include<stdlib.h>
#include<queue>
using namespace std;
struct TreeNode
{
int _data;
TreeNode* _left;
TreeNode* _right;
TreeNode(int x = 0)
:_data(x)
, _right(NULL)
, _left(NULL)
{}
};
class Tree
{
public:
Tree()
:_root(NULL)
{}
Tree(const int* arr,size_t size,const int invalue)
{
size_t index = 0;
_CreateTree(_root,arr, size,index, invalue);
}
bool IsComplete()
{
if (_root == NULL)
return false;
queue<TreeNode*> q;
q.push(_root);
while (!q.empty())
{
TreeNode* top = q.front();
if (top->_left&&top->_right)
{
q.pop();
q.push(top->_left);
q.push(top->_right);
}
if (top->_left == NULL&&top->_right)
return false;
if ((top->_left&&top->_right == NULL) || (top->_left == NULL&&top->_right==NULL))
{
q.pop();
while (!q.empty())
{
top = q.front();
if (top->_left == NULL&&top->_right == NULL)
q.pop();
else
return false;
}
return true;
}
}
return true;
}
protected:
void _CreateTree(TreeNode*& root,const int arr[],size_t size,size_t& index,const int value)
{
if (index < size&&arr[index] != value)
{
root = new TreeNode(arr[index]);
_CreateTree(root->_left, arr, size, ++index, value);
_CreateTree(root->_right, arr, size, ++index, value);
}
}
private:
TreeNode* _root;
};
int main()
{
int arr[10] = { 1, 2, 3, '#', '#', 4, '#', '#', 5, 6 };
Tree tree(arr, 10, '#');
cout << tree.IsComplete() << endl;
system("pause");
return 0;
}