zoukankan      html  css  js  c++  java
  • USACO / American Heritage (经典递归入门)

    描述

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

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

                    C
                   / \
                  /   \
                 B     G
                / \   /
               A   D H
                  / \
                 E   F
    

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

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

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

    格式

    PROGRAM NAME: heritage

    INPUT FORMAT:

    (file heritage.in)

    第一行: 树的中序遍历

    第二行: 同样的树的前序遍历

    OUTPUT FORMAT:

    (file heritage.out)

    单独的一行表示该树的后序遍历。

    SAMPLE INPUT

    ABEDFCHG
    CBADEFGH
    

    SAMPLE OUTPUT

    AEFDBHGC



    分析:
      经典的递归!第二个串中的第一个字符就是树根,然后这个字符在第一个串中的位置左边的就是左子树,右边的就是右子树。然后就是不停地递归建根、左子树、右子树。提交了两次,第一次结尾忘了输回车。。。

    USER: Zhipeng ZHANG [138_3531]
    TASK: heritage
    LANG: C++
    
    Compiling...
    Compile: OK
    
    Executing...
       Test 1: TEST OK [0.011 secs, 3348 KB]
       Test 2: TEST OK [0.011 secs, 3348 KB]
       Test 3: TEST OK [0.000 secs, 3348 KB]
       Test 4: TEST OK [0.011 secs, 3348 KB]
       Test 5: TEST OK [0.000 secs, 3348 KB]
       Test 6: TEST OK [0.011 secs, 3348 KB]
       Test 7: TEST OK [0.000 secs, 3348 KB]
       Test 8: TEST OK [0.000 secs, 3348 KB]
       Test 9: TEST OK [0.011 secs, 3348 KB]
    
    All tests OK.

    Your program ('heritage') produced all correct answers! This is your submission #2 for this problem. Congratulations!

    
    
    /*
    ID:138_3531
    LANG:C++
    TASK: heritage
    */
    
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <cstring>
    #include <string>
    
    using namespace std;
    
    string s1,s2;
    int n;
    void work(string s1)
    {
        if (!s1.size())
            return ;
        for (size_t i=0;i<s2.size();i++)
            if (s1.find(s2[i])!=-1)
            {
                int l=s1.size();
                int p=s1.find(s2[i]);
                work(s1.substr(0,p));        //substr是生成从0位置开始,p长度的子串的函数
                work(s1.substr(p+1,l-p-1));
                cout<<s1[p];
                break;
            }
        return ;
    }
    
    int main()
    {
        freopen("heritage.in","r",stdin);
        freopen("heritage.out","w",stdout);
    
        cin>>s1;
        cin>>s2;
        work(s1);
        cout<<endl;
        return 0;
    }
    
    
    


    举杯独醉,饮罢飞雪,茫然又一年岁。 ------AbandonZHANG
  • 相关阅读:
    使用Python学习RabbitMQ消息队列
    Python调用nmap扫描网段主机信息生成xml
    扫描网站服务器真实IP的小脚本
    C语言实现将彩色BMP位图转化为二值图
    Python socket编程之构造IP首部和ICMP首部
    ARP协议抓包之帧长度和Gratuitous ARP的问题
    合天解密200-找茬游戏
    合天misc100
    IDF实验室-简单的js解密
    IDF实验室—不难不易的js加密
  • 原文地址:https://www.cnblogs.com/AbandonZHANG/p/2621506.html
Copyright © 2011-2022 走看看