L2-011 玩转二叉树

#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
int in[300];//中序遍历数组 
int f[300];//前序遍历 
int cnt;
struct node 
{
	int data;
	node *l,*r;
	node(){
		l=NULL;
		r=NULL;
	}
};
vector<node *>v;
node *create(node *root,int first,int end)
{
	root=new node();
	root->data=f[cnt++]; 
	int i;
	for(i=first;i<=end;i++)
	{
		if(in[i]==root->data){
			break;
		}
	}
	if(i>first){
		root->l=create(root->l,first,i-1);
	}
	if(i<end){
		root->r=create(root->r,i+1,end);
	}
	return root;
}
void regulate(node *root)
{
	if(root!=NULL&&(root->r!=NULL||root->l!=NULL))
	{
		v.push_back(root);
		regulate(root->l);
		regulate(root->r);
	}else{
		return ;
	}
}
void sequence(node *root)//层次遍历 
{
	int num=0;
	if(!root){
		return ;
	}
	queue<node *>v;
	v.push(root);
	num++;
	node *tmp;
	while(!v.empty())
	{
		tmp=v.front();
		v.pop();
		if(num>1){
			printf(" ");
		}
		printf("%d",tmp->data);
		if(tmp->l){
			v.push(tmp->l);
		}
		if(tmp->r){
			v.push(tmp->r);
		}
		num++;
	}
}
int main() 
{
	int n;
	scanf("%d",&n);
	int i;
	for(i=0;i<n;i++)
	{
		scanf("%d",&in[i]);
	}
	for(i=0;i<n;i++)
	{
		scanf("%d",&f[i]);
	}
	cnt=0; 
	node *root=create(root,0,n-1);
	regulate(root);
	vector<node *>::reverse_iterator it=v.rbegin();
	while(it!=v.rend())
	{
		if((*it)->l==NULL&&(*it)->r!=NULL){
			(*it)->l=(*it)->r;
			(*it)->r=NULL;
		}else if((*it)->l!=NULL&&(*it)->r==NULL){
			(*it)->r=(*it)->l;
			(*it)->l=NULL;
		}else{
			node *tt;
			tt=(*it)->r;
			(*it)->r=(*it)->l;
			(*it)->l=tt;
		}
		it++;
	}
	sequence(root);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值