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;
}