PTA:L2-011 玩转二叉树 && L2-006 树的遍历

PTA:L2-011 玩转二叉树 

题解:

由中序遍历和先序遍历得到二叉树。镜面反转,层次遍历,先右后左。

代码:

#include <bits/stdc++.h>
using namespace std;
int const N = 10000;
int const inf = 0x7f7f7f7f;
int n,pre[N],in[N],pos;
struct Node
{
	int val,l,r;
}node[N];
void rebuild(int id,int l,int r){
	if(l > r){
		node[id].val = inf;
		return;
	}
	int val = pre[++pos];
	node[id].val = val;
	node[id].l = id<<1;
	node[id].r = id<<1|1;
	int mid = find(in,in+r,val) - in;
	rebuild(id<<1,l,mid-1);	
	rebuild(id<<1|1,mid+1,r);
}
void print(){
	queue<int>q;
	q.push(1);
	while(!q.empty()){
		int id = q.front();	q.pop();
		if(id == 1)	cout<<node[id].val;
		else	cout<<" "<<node[id].val;
		if(node[id<<1|1].val != inf)	q.push(id<<1|1);
		if(node[id<<1].val != inf)	q.push(id<<1);
	}
	cout<<endl;
}
int main(){	
	cin>>n;
	for(int i=1;i<=n;i++)	cin>>in[i];
	for(int i=1;i<=n;i++)	cin>>pre[i];
	rebuild(1,1,n);   
	print();
	return 0;
}

L2-006 树的遍历

题解:这一题是有后序遍历和中序得二叉树,顺序要反一下。

代码:

#include <bits/stdc++.h>
using namespace std;
int const N = 10000;
int const inf = -1;
int n,post[N],in[N],pos;
struct Node
{
	int val,l,r;
}node[N];
void rebuild(int id,int l,int r){
	if(l > r){
		node[id].val = inf;
		return;
	}
	int val = post[++pos];
	node[id].val = val;
	node[id].l = id<<1;
	node[id].r = id<<1|1;
	int mid = find(in,in+r,val) - in;		
	rebuild(id<<1|1,mid+1,r);
	rebuild(id<<1,l,mid-1);	

}
void print(){
	queue<int>q;
	q.push(1);
	while(!q.empty()){
		int id = q.front();	q.pop();
		if(id == 1)	cout<<node[id].val;
		else	cout<<" "<<node[id].val;
		if(node[id<<1].val != inf)	q.push(id<<1);
		if(node[id<<1|1].val != inf)	q.push(id<<1|1);
	}
	cout<<endl;
}
int main(){	
	cin>>n;
	for(int i=n;i>=1;i--)	cin>>post[i];
	for(int i=1;i<=n;i++)	cin>>in[i];
	rebuild(1,1,n); 
	print();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42264485/article/details/88375451