7-43 是否完全二叉搜索树 (30 point(s))

将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。

输入格式:

输入第一行给出一个不超过20的正整数N;第二行给出N个互不相同的正整数,其间以空格分隔。

输出格式:

将输入的N个正整数顺序插入一个初始为空的二叉搜索树。在第一行中输出结果树的层序遍历结果,数字间以1个空格分隔,行的首尾不得有多余空格。第二行输出YES,如果该树是完全二叉树;否则输出NO

样例1:">样例1:">样例1:">样例1:">样例1:">样例1:">样例1:">输入样例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

对于二叉树的判定存在错误的地方只能通过左子树,在到右子树才能够成功,在以下代码中,在PTA里面能过,但是其实逻辑上存在一点问题。

就是对于这一串数字

7

9 17 4 24 16 5 27

这段代码显示错误,但是里面的树不符合要求,更加无奈的是一下代码是正确的输出YES。最后的那种方法比较好一点,能考虑到这些情况。

8

9 17 4 24 16 5 27 22
#include<iostream>
#include<queue>
using namespace std;
struct tree
{
	long long val;
	struct tree *l,*r;
};
bool flag1=false;
typedef struct tree tRee;
typedef tRee* Tree;
void fun(Tree& a,Tree p)
{
	if(a==NULL)
	{
		a=p;
		return ;
	}
	if(a->val<p->val)fun(a->l,p);
	else fun(a->r,p);
}
void print(Tree head)
{
	queue<Tree> bns;
	queue<long long> ans;
	bns.push(head);
	ans.push(head->val);
	bool flag=false;
	while(!bns.empty())
	{
		Tree s=bns.front();
		bns.pop();
		
		if(s->l!=NULL)
		{
			bns.push(s->l);
			ans.push(s->l->val);
		}
		else flag=true;
		if(s->r!=NULL)
		{
			bns.push(s->r);
			ans.push(s->r->val);
			if(flag)flag1=true;
		}
		else flag=true;
	}
	bool io=true;
	while(!ans.empty())
	{
		if(io){
			cout<<ans.front();
			io=false;
		}
		else cout<<" "<<ans.front();
		ans.pop();
	}
	cout<<endl;
	return ;
}
int main()
{
	long long sum;
	cin>>sum;
	Tree head;
	head=(Tree)malloc(sizeof(tRee));
	head=NULL;
	for(long long n=0;n<sum;n++)
	{
		long long number;
		cin>>number;
		Tree p;
		p=(Tree)malloc(sizeof(tRee));
		p->l=NULL;
		p->r=NULL;
		p->val=number;
		fun(head,p);
	}
	print(head);
	if(!flag1)cout<<"YES"<<endl;
	else cout<<"NO"<<endl;
	return 0;
}
#include<iostream>
using namespace std;
int bns[100010]={0};
void create(int n,int number)
{
	if(bns[n]==0)
	{
		bns[n]=number;
		return ;
	}
	if(bns[n]<number)create(n*2,number);
	else create(n*2+1,number);
	return ;
}
int main()
{
	int sum;
	cin>>sum;
	for(int n=0;n<sum;n++)
	{
		int number;
		cin>>number;
		create(1,number);
	}
	int i,j;
	for(i=2,j=2,cout<<bns[1];j<=sum;i++)
	{
		if(bns[i]){
			cout<<" "<<bns[i];
			j++;
		}
	}
	cout<<endl;
	if(i==j)cout<<"YES"<<endl;
	else cout<<"NO"<<endl;
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值