题目:
将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。
输入格式:
输入第一行给出一个不超过20的正整数N;第二行给出N个互不相同的正整数,其间以空格分隔。
输出格式:
将输入的N个正整数顺序插入一个初始为空的二叉搜索树。在第一行中输出结果树的层序遍历结果,数字间以1个空格分隔,行的首尾不得有多余空格。第二行输出YES,如果该树是完全二叉树;否则输出NO。
输入样例1:
9
38 45 42 24 58 30 67 12 51
输出样例1:
38 45 24 58 42 30 12 67 51
YES
输入样例2:
8
38 24 12 45 58 67 42 51
输出样例2:
38 45 24 58 42 12 67 51
NO
#include<bits/stdc++.h>
using namespace std;
typedef struct NODE
{
int data;
struct NODE *left;
struct NODE *right;
} NODE,*TREE;
bool first=true;
TREE build(TREE tree,int x)
{
if(!tree)
{
tree=(NODE*)malloc(sizeof(NODE));
tree->data=x;
tree->left=NULL;
tree->right=NULL;
}
else if(tree->data<x)
tree->left=build(tree->left,x);
else
tree->right=build(tree->right,x);
return tree;
}
int GetHeight( TREE BT )
{
if(BT==NULL)
return 0;
int l=0,r=0;
if(BT->left!=NULL)
l=GetHeight(BT->left);
if(BT->right!=NULL)
r=GetHeight(BT->right);
return l>r?l+1:r+1;
}
void dfs(TREE BT,int i,int c)
{
if(BT==NULL)
return;
if(c==i)
{
if(first)
cout<<BT->data;
else
cout<<' '<<BT->data;
first=false;
return;
}
dfs(BT->left,i,c+1);
dfs(BT->right,i,c+1);
}
int LevelorderTraversal(TREE BT )
{
int h=GetHeight(BT);
for(int i=0; i<h; i++)
{
dfs(BT,i,0);
}
return h;
}
//bool judge(TREE tree,int h,int i,bool flag)
//{
// if(!tree)
// return true;
// if(flag==true)
// {
//
// if(i<h&&tree->left==NULL&&tree->right==NULL)
// {
// h=i;
// flag=false;
// }
// }
// return judge(tree->left,h,i+1,flag)&&judge(tree->right,h,i+1,flag);
//}
bool judge(TREE T)
{
if (T == NULL)
return false;
queue<TREE> Q;
Q.push(T);
while (!Q.empty())
{
TREE p = Q.front();
Q.pop();
if (p->left && p->right)
{
Q.push(p->left);
Q.push(p->right);
}
else if(p->right && p->left == NULL)
return false;
else
{
if(p->left && p->right == NULL)
Q.push(p->left);
while(!Q.empty())
{
p = Q.front();
Q.pop();
if(p->left || p->right)
return false;
}
}
}
return true;
}
int main()
{
//freopen("in.txt","r",stdin);
int n;
cin>>n;
int a[21];
TREE base_tree=NULL;
for(int i=0; i<n; i++)
{
cin>>a[i];
base_tree=build(base_tree,a[i]);
}
int h=LevelorderTraversal(base_tree);
bool flag=true;
cout<<endl;
if(judge(base_tree))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
更多PTA代码请到我的博客里参考
ps:代码仅供参考,请勿抄袭