求先序排列 蓝桥杯

来源:互联网 发布:淘宝假物流单号怎么办 编辑:程序博客网 时间:2024/05/02 01:36
         问题描述
    给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。
         输入格式
    两行,每行一个字符串,分别表示中序和后序排列
         输出格式
    一个字符串,表示所求先序排列
         样例输入
BADC
BDCA
样例输出

ABCD

解题思路:

后序遍历的最后一位是根,因此可以在中序遍历中找到后序遍历的根,然后递归右子树,左子树即可

#include<cstdio>#include<iostream> #include<cstring>#include<string>#include<algorithm>using namespace std;struct node{char data;struct node *lc,*rc;};bool vis[26];void dfs(node *&T,string a,string b){int lb=b.length();int la=a.length();if(lb>0&&la>0){T=(node *)malloc(sizeof(node));int t=lb-1;while(t){if(!vis[b[t]-'A'])break;elset--;}if(t<0) return ;T->data=b[t];vis[b[t]-'A']=true;dfs(T->rc,a.substr(a.find(b[t])+1,la-a.find(b[t])-1),b.substr(0,t));dfs(T->lc,a.substr(0,a.find(b[t])),b.substr(0,t));}elseT=NULL;}void visit(node *T){if(T!=NULL){cout<<T->data;visit(T->lc);visit(T->rc);}}int main(){string s1,s2;cin>>s1>>s2;memset(vis,0,sizeof(vis));int l1=s1.length(),l2=s2.length();node *T;dfs(T,s1,s2);visit(T);} 


0 0