1.根据后序和中序遍历输出先序遍历
本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。
输入格式:
第一行给出正整数N(≤30),是树中结点的个数。随后两行,每行给出N个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。
输出格式:
在一行中输出Preorder:
以及该树的先序遍历结果。数字间有1个空格,行末不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
Preorder: 4 1 3 2 6 5 7
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y second
#define mst(a) memset(a,0x3f,sizeof a)
const int N = 1010, mod = 1e9+7, P = 131;
int n;
int p[N],in[N];
//HASH记录每个点的左儿子,右儿子
unordered_map<int,int>l,r,pos;
int build(int il,int ir,int pl,int pr)
{
//当前子树的根节点
int root=p[pr];
//中序遍历的分界点
int k=pos[root];
//建左子树
if(il<k) l[root]=build(il,k-1,pl,pl+(k-1-il));
//建右子树
if(ir>k) r[root]=build(k+1,ir,pl+(k-1-il)+1,pr-1);
return root;
}
void dfs(int root)
{
cout<<" "<<root;
if(!l[root]&&!r[root]) return ;
if(l[root]) dfs(l[root]);
if(r[root]) dfs(r[root]);
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>p[i];
for(int i=0;i<n;i++)
{
cin>>in[i];
//中序遍历中值为in[i]的点的下标为i
pos[in[i]]=i;
}
int root=build(0,n-1,0,n-1);
cout<<"Preorder:";
dfs(root);
return 0;
}
2.根据后序和中序遍历输出层序遍历
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y second
#define mst(a) memset(a,0x3f,sizeof a)
const int N = 1010, mod = 1e9+7, P = 131;
int n;
unordered_map<int ,int>l,r,pos;
int p[N],in[N];
int build(int il,int ir,int pl,int pr)
{
int root = p[pr];
int k = pos[root];
if(il<k) l[root] = build(il,k-1,pl,pl+k-1-il);
if(ir>k) r[root] = build(k+1,ir,pl+k-1-il+1,pr-1);
return root;
}
void bfs(int root)
{
queue<int>q;
q.push(root);
while(q.size())
{
int t=q.front();
q.pop();
cout<<t;
//.count()返回key对应的value的个数
if(l.count(t)) q.push(l[t]);
if(r.count(t)) q.push(r[t]);
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>p[i];
for(int i=0;i<n;i++)
{
cin>>in[i];
pos[in[i]]=i;
}
int root = build(0,n-1,0,n-1);
bfs(root);
return 0;
}
3.根据中序和前序遍历反转子节点输出层序遍历
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y second
#define mst(a) memset(a,0x3f,sizeof a)
const int N = 1010, mod = 1e9+7, P = 131;
int n;
unordered_map<int ,int>l,r,pos;
int b[N],in[N];
int build(int il,int ir,int bl,int br)
{
int root = b[bl];
int k = pos[root];
if(il<k) l[root] = build(il,k-1,bl+1,bl+1+k-1-il);
if(ir>k) r[root] = build(k+1,ir,bl+1+k-1-il+1,br);
return root;
}
void bfs(int root)
{
queue<int>q;
q.push(root);
while(q.size())
{
int t=q.front();
q.pop();
cout<<t<<" ";
if(r.count(t)) q.push(r[t]);
if(l.count(t)) q.push(l[t]);
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>in[i];
pos[in[i]]=i;
}
for(int i=0;i<n;i++) cin>>b[i];
int root = build(0,n-1,0,n-1);
bfs(root);
return 0;
}