码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-06-07 01:09:16      阅读:408      评论:0      收藏:0      [点我收藏+]

标签:

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

#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)

标签:

原文地址:http://www.cnblogs.com/northsnow95/p/5565636.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!