P1827 [USACO3.4]美国血统 American Heritage (数据结构之树的前序中序和后序遍历

P1827 [USACO3.4]美国血统 American Heritage(数据结构之树的前序中序和后序遍历
题目传送门
题目描述

农夫约翰非常认真地对待他的奶牛们的血统。然而他不是一个真正优秀的记帐员。他把他的奶牛 们的家谱作成二叉树,并且把二叉树以更线性的“树的中序遍历”和“树的前序遍历”的符号加以记录而 不是用图形的方法。

你的任务是在被给予奶牛家谱的“树中序遍历”和“树前序遍历”的符号后,创建奶牛家谱的“树的 后序遍历”的符号。每一头奶牛的姓名被译为一个唯一的字母。(你可能已经知道你可以在知道树的两 种遍历以后可以经常地重建这棵树。)显然,这里的树不会有多于 26 个的顶点。 这是在样例输入和 样例输出中的树的图形表达方式:

P1827 [USACO3.4]美国血统 American Heritage (数据结构之树的前序中序和后序遍历_第1张图片

树的中序遍历是按照左子树,根,右子树的顺序访问节点。

树的前序遍历是按照根,左子树,右子树的顺序访问节点。

树的后序遍历是按照左子树,右子树,根的顺序访问节点。
输入格式

第一行: 树的中序遍历

第二行: 同样的树的前序遍历
输出格式

单独的一行表示该树的后序遍历。
输入输出样例
输入 #1
ABEDFCHG
CBADEFGH
输出 #1
AEFDBHGC

解题思路:
根据前序和中序序列可以构造出唯一的一棵树。

typedef struct {
   
    int l,r;
}node;

这是树的每一个节点。
那么怎么构造呢?
前序序列: 中 -> 左 -> 右
中序序列: 左 -> 中 -> 右
根据前序序列的第一个节点可以把中序序列分成两节,
又根据中序序列的左右节点数也可以把前序序列分成两节。
这样就形成了递归关系。

void build(string in,string pr,int n) {
   //ABEDFCHG//CBADEFGH
    if(pr.empty()==1)  //当前序序列为空时退出
        return;
    if(in==pr&&in.length()==1&&pr.length()==1)//当两序列均为一个节点且相等时退出
        return;
    int pos = in.find(pr[0]); //5   pos==n 此处多余了,直接用n就可了。。 
    char c = pr[0];              //C
    pr.erase(pr.begin());        //BADEFGH
    string in_left, in_right, pr_left, pr_right;
    in_left = in.substr(0, pos);    //ABEDF
    in_right = in.substr(pos + 1, in.length(

你可能感兴趣的:(P1827 [USACO3.4]美国血统 American Heritage (数据结构之树的前序中序和后序遍历)