题解:
一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
1>如果树为空,则直接返回错
2>如果树不为空:层序遍历二叉树
2.1>如果一个结点左右孩子都不为空,则pop该节点,将其左右孩子入队列;
2.1>如果遇到一个结点,左孩子为空,右孩子不为空,则该树一定不是完全二叉树;
2.2>如果遇到一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空;则该节点之后的队列中的结点都为叶子节点;该树才是完全二叉树,否则就不是完全二叉树; [3]
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int flag=0;
typedef struct node
{
int data;
struct node *left,*right;
}tree;
tree*creat(tree*root,int x)
{
if(!root)
{
struct node *root;
root=(tree*)malloc(sizeof(tree));
root->data=x;
root->left=root->right=NULL;
return root;
}
else
{
if(x>root->data)
{
root->left=creat(root->left,x);
}
else
{
root->right=creat(root->right,x);
}
}
return root;
}
void mid(tree*root)
{
if(root!=NULL)
{
mid(root->left);
printf("%d",root->data);
mid(root->right);
}
}
void levelOrder(tree*root)
{
int in,out;
in=out=0;
tree*p[55];
p[in++]=root;
while(in>out)
{
if(p[out])
{
if(flag==0)
{
printf("%d",p[out]->data);
flag=1;
}
else
{
printf(" %d",p[out]->data);
}
p[in++]=p[out]->left;
p[in++]=p[out]->right;
}
out++;
}
}
int judgetree(tree*root)
{
if(!root)
{
return 1;
}
tree*p[40];
int in=0;
int out=0;
p[out++]=root;
while(in<out)
{
root=p[in++];
if(root)
{
p[out++]=root->left;
p[out++]=root->right;
}
else
{
while(in<out)
{
root=p[in++];
if(root!=NULL)
{
return 0;
}
}
}
}
return 1;
}
int main()
{
int n;
scanf("%d",&n);
tree*root;
root=NULL;
for(int i=0;i<n;i++)
{
int x;
scanf("%d",&x);
root=creat(root,x);
}
levelOrder(root);
printf("\n");
int t=judgetree(root);
if(t==1)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
return 0;
}
第二种做法:数组模拟
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int tree[100];
int max1=0;
void create(int x,int i)
{
if(tree[i]==0)
{
if(i>max1)
{
max1=i;
}
tree[i]=x;
}
else
{
if(x<tree[i])
{
create(x,i*2+1);
}
else
{
create(x,i*2);
}
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int x;
scanf("%d",&x);
create(x,1);
}
for(int i=0;i<=max1;i++)
{
if(tree[i]!=0)
{
if(i==max1)
{
printf("%d\n",tree[i]);
}
else
{
printf("%d ",tree[i]);
}
}
}
if(max1==n)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
return 0;
}