二叉树三序遍历,已知其中两种求另一种
前序,中序 ——>中序
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pll; const int N=2e5+5; const ll inf=1e18; const ll mod=998244353; ll a[N],b[N],sum[N]; int cnt=-1; string p,q; map<char,int> mp; vector<char> ans; void solve(int l,int r){ if(l<0||l>=q.size()||r<0||r>=q.size()) return ; if(l>r) return ; cnt++;//遍历前序的每一位 char rt=p[cnt];int pt=mp[p[cnt]]; solve(l,pt-1); solve(pt+1,r); ans.push_back(rt); } signed main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); while(cin>>p>>q){ for(int i=0;i<q.size();i++){ mp[q[i]]=i; } ans.clear(); cnt=-1; solve(0,q.size()-1); for(auto it:ans) cout<<it; cout<<endl; } }
中序,后序——>前序
题目:https://ac.nowcoder.com/acm/contest/21763/1011
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pll; const int N=2e5+5; const ll inf=1e18; const ll mod=998244353; void solve(string in,string en){ if(in.size()>0){ int s=in.find(en.back()); cout<<en.back(); solve(in.substr(0,s),en.substr(0,s)); solve(in.substr(s+1),en.substr(s,in.size()-s-1)); } } signed main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); string p,q;cin>>p>>q; solve(p,q); }
前序,后序——>中序
题目:https://ac.nowcoder.com/acm/contest/21763/1012
class Solution { public: vector<int> ans;//存储中序遍历 void sub(int l1,int r1,int l2,int r2,vector<int>& pre,vector<int>& suf){ if(l1==r1){//如果只有一个点,即已经是最左边的点了,存入 ans.push_back(pre[l1]);return ; } int pt=pre[l1+1];//找到左边的一个节点 int id=-1; for(int i=l2;i<=r2;i++){ if(pt==suf[i]){ id=i;break;} } sub(l1+1,l1+1+id-l2,l2,id,pre,suf); ans.push_back(pre[l1]); if(id+1<=r2-1) sub(l1+1+id-l2+1,r1,id+1,r2-1,pre,suf);//判断有没有右子树了 } vector<int> solve(int n, vector<int>& pre, vector<int>& suf) { sub(0,n-1,0,n-1,pre,suf); return ans; } };