4-15 根据后序和中序遍历输出先序遍历 (15分)
本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。
输入格式:
第一行给出正整数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
Code:
使用板子:后序+中序输出先序
后序+中序输出先序板子理解BTree buildtree(int root,int start,int end)
:
后序(左右根)最后出现的是根结点
root
为当前后序的根结点下标(根据当前的中序序列可以把当前的中序分为左根右)
start
为当前中序序列起始位置
end
为当前中序序列结束位置
k
为当前中序序列的根结点位置,分割当前中序序列左右子树的下标
#include<bits/stdc++.h>
using namespace std;
vector<int> post,in;
void pre(int root,int start,int end){
if(start>end) return;
int k;
for(k=start;k<end;k++)
if(in[k]==post[root]) break;
cout << " " << post[root];
pre(root-1-end+k,start,k-1);
pre(root-1,k+1,end);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int N;
cin >> N;
post.resize(N);
in.resize(N);
for(int i=0;i<N;i++) cin >> post[i];
for(int i=0;i<N;i++) cin >> in[i];
cout << "Preorder:";
pre(N-1,0,N-1);
return 0;
}