HDU 1710 Binary Tree Traversals

题意:给二叉树的前序遍历和中序遍历,写出后序遍历。


想法:首先还原二叉树,然后再后序遍历一边即可;

前序遍历,是买一个node放入二叉树的顺序,中序遍历,完美展现了各个node在二叉树中的相对位置。

 
 
记为x:1 2 4 7 3 5 8 9 6 记为Y:4 7 2 1 8 5 9 3 6
放1:找到1在y中的位置,1为根;

放2:在y中找到2的位置,发现在1的左边,则表示2是1的左儿子;

放4:在y中找到4的位置,发现在1的左边,2的左边,则表示4是2的左儿子;

放7:在y中找到7的位置,发现在1的左边,2的左边,4的右边,则表示7是4的右儿子;

放3:在y中找到3的位置,发现在1的右边,则表示3是1的右儿子;

......(其他的如同上述思路进行搜索)


#include<iostream>
#include<cstring>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
const int N=1000+50;
struct node
{
	int k;
	node *lson;
	node *rson;
};

int pre[N];
int mid[N];
int id[N];
int n;
int ok;

void BuildTree(node **rt,int id_cur)
{
	if((*rt)==NULL)
	{
		*rt=(node*)malloc(sizeof(node));
		(*rt)->k=mid[id_cur];
		(*rt)->lson=NULL;
		(*rt)->rson=NULL;
	}
	else
	{
		int id_cmp=id[(*rt)->k];
		if(id_cur<id_cmp)
		{
			BuildTree(&((*rt)->lson),id_cur);
		}
		else 
		{
			BuildTree(&((*rt)->rson),id_cur);
		}
	}
}

void MidPrintTree(node *rt)
{
	if(rt!=NULL)
	{
		MidPrintTree(rt->lson);
		MidPrintTree(rt->rson);
		if(ok)
		{
			cout<<rt->k;
			ok=0;
		}
		else 
		{
			cout<<" "<<rt->k;
		}
	}
}

int main()
{
	while(cin>>n)
	{
		for(int i=1;i<=n;i++)
		{
			cin>>pre[i];
		}
		for(int i=1;i<=n;i++)
		{
			cin>>mid[i];
			id[mid[i]]=i;
		}
		node *root;
		root=NULL;
		pre[0]=1;
		for(int i=1;i<=n;i++)
		{
			BuildTree(&root,id[pre[i]]);
		}
		ok=1;
		MidPrintTree(root);
		cout<<endl;
	}
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值