L2-011. 玩转二叉树(PAT)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了L2-011. 玩转二叉树(PAT)相关的知识,希望对你有一定的参考价值。

很简单的一道题目,注意对二叉树的深度分析一下,把数组开大点,前序中序求这个树,我用数组静态做的,有点像是线段树的构造过程,数据也没夸张到需要动态分配内存,不过后边的反转二叉树又让我想到了那个梗,蛤蛤蛤蛤。

#include  <iostream>
#include  <cstdio>
#include  <cstring>
#include  <queue>
using namespace std;
const int maxn=1000000;
int n,num(0);
int pre[maxn],in[maxn],tree[maxn];

void build(int tag,int left,int right)
{
	tree[tag]=pre[++num];
	if(left==right)
		return;
	int index=-1;
	for(int i=left;i<=right;i++)
	{
		if(in[i]==tree[tag])
		{
			index=i;
			break;
		}
	}
	if(index==-1)
		return;
	if(index-1>=left)
		build(tag<<1,left,index-1);
	if(index+1<=right)
		build(tag<<1|1,index+1,right);
}

void bfs()
{
	queue<int> que;
	que.push(1);
	int tag=tree[1];
	while(!que.empty())
	{
		int temp=que.front();
		que.pop();
		if(tree[temp]!=tag)
			printf(" ");
		printf("%d",tree[temp]);
		if(tree[temp*2+1]!=0)
			que.push(temp*2+1);
		if(tree[temp*2]!=0)
			que.push(temp*2);
	}
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&in[i]);
	for(int i=1;i<=n;i++)
		scanf("%d",&pre[i]);
	build(1,1,n);
	bfs();
	printf("\n");
	return 0;
}

  

以上是关于L2-011. 玩转二叉树(PAT)的主要内容,如果未能解决你的问题,请参考以下文章

L2-011 玩转二叉树

L2-011 玩转二叉树 (25分)

L2-011玩转二叉树(25分)

L2-011. 玩转二叉树

L2-011 玩转二叉树(建树+BFS)

团体程序设计天梯赛 L2-006. 树的遍历 L2-011. 玩转二叉树