天梯赛-是否完全二叉搜索树

本文介绍了一种方法来判断由一系列数字构建的二叉搜索树(BST)是否为完全二叉树,并实现了层序遍历输出。通过确定树的最大深度及特殊的遍历策略,确保了树结构满足完全二叉树的定义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

输入格式:

输入第一行给出一个不超过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



题意是输入一个n,再输入n个数,输出按这个序列插入一个左大右小的BST,试着去判断这个bst是不是一颗完全的bst,符不符合完全树的定义,再输出层序遍历序列


如何判断一棵树是否是完全二叉树?我们从条件入手

1 完全二叉树倒数第二层以上包括倒数第二层全满。

2 最后一层的最后一个节点左边全满

于是我们不妨先把最大层数找出来,然后用搜索带个层数的参数,每次搜索判断如果这一层不是最后一层而少点 那么就不是完全二叉树  满足第一点的判断

我们按照先右后左的顺序搜索,如果走到最后一层的第一个点一定是最右点 标记一下 再走到后面的这一层的节点时如果不存在 就不是完全二叉树 满足第二点判断

如果刚才两点都没问题 就符合完全二叉树。


code:

#include<bits/stdc++.h>
using namespace std;
typedef struct bst
{
	int d;
	bst *l,*r;
}NN,*NNN;
int flo;
NNN insert(NNN p,int t,int lev)
{
	if(p)
	{
		if(t > p->d)p->l = insert(p->l,t,lev+1);
		else p->r=insert(p->r,t,lev+1);
		return p;
	}
	else
	{
		NNN q = (NNN)malloc(sizeof(NN));
	//	cout<<t<<endl;
		q->d=t;
		q->l=q->r=NULL;
		flo = max(flo,lev);
		return q;	
	}
}
bool flag;
bool judge1(NNN p,int lev)
{
	if(p)
	{
		if(lev == flo)flag=1;
		bool a,b;
		a = judge1(p->r,lev+1);
		b = judge1(p->l,lev+1);
		return a&b;
	}
	else if(lev<=flo-1||(lev==flo&&flag))return 0;
	else return 1;
}
void levelTre(NNN p)
{
	queue<NNN>q;
	q.push(p);
	while(q.size())
	{
		NNN a = q.front();q.pop();
		printf("%d",a->d);
		if(a->l)q.push(a->l);
		if(a->r)q.push(a->r);
		if(q.size())printf(" ");
		else puts("");
	}
}
int main()
{
	int n;
	cin>>n;
	NNN p = NULL;
	for(int i=1;i<=n;i++)
	{
		int t;scanf("%d",&t);
		p=insert(p,t,1);
	}
//	cout<<flo<<endl;
	levelTre(p);
	bool res = judge1(p,1);
	if(res)puts("YES");
	else puts("NO");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值