• 清华机试:有前序 中序,输出后序。


    题目描述:

    二叉树的前序、中序、后序遍历的定义:
    前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树;
    中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树;
    后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。
    给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。

    输入:

    两个字符串,其长度n均小于等于26。
    第一行为前序遍历,第二行为中序遍历。
    二叉树中的结点名称以大写字母表示:A,B,C....最多26个结点。

    输出:

    输入样例可能有多组,对于每组测试样例,
    输出一行,为后序遍历的字符串。

    样例输入:
    ABC
    BAC
    FDXEAG
    XDEFAG
    样例输出:
    BCA
    XEDGAF
    package 清华;

    import java.io.BufferedInputStream;
    import java.util.Scanner;

    public class 求后序遍历 {
    static String str1,str2;
    public static void main(String[] args) {
    Scanner s = new Scanner(new BufferedInputStream(System.in));
    while(s.hasNext()){
    str1 = s.next();
    str2 = s.next();
    Node root = creatTree(str1,str2);
    lastSee(root);
    System.out.println();
    }

    }

    static void lastSee(Node tree){
    if(tree == null)return;
    lastSee(tree.l);
    lastSee(tree.r);
    System.out.print(tree.data);
    }
    static Node creatTree(String s1,String s2){
    Node n = null;
    if(s1 == null || s2==null)
    return null;
    String left2 = null,right2 = null,news1 = null,news2 = null;
    int len1 = 0;
    char root = s1.charAt(0);
    int index=s2.indexOf(root);
    if(index>0){
    left2 = s2.substring(0,index);
    len1 = left2.length();
    }
    if(index<s2.length()-1)
    right2 = s2.substring(index+1);
    news1 = s1.substring(1, 1+len1);
    news2 = s1.substring(1+len1);
    n = new Node(creatTree(news1,left2),creatTree(news2,right2),s1.charAt(0));
    return n;
    }
    }

    class Node{
    Node l;
    Node r;
    char data;
    public Node(Node l, Node r, char data) {
    this.l = l;
    this.r = r;
    this.data = data;
    }

    }

    还有不用建树的方法,拷贝别人的代码,学习了。

    char a[30],b[30];
    void Bice(int pf,int pr,int mp,int mr)
    {
    if(pf>pr)
    return;
    int i;
    char c=a[pf];
    for(i=0;i<=mr-mp;i++)
    if(b[mp+i]==c)
    break;
    Bice(pf+1,pf+i,mp,mp+i-1);
    Bice(pf+i+1,pr,mp+i+1,mr);
    cout<<c;
    }
    int main()
    {
    while(cin>>a>>b)
    {
    int n=strlen(a);
    Bice(0,n-1,0,n-1);
    cout<<endl;
    }
    }



  • 相关阅读:
    LOJ #6183 看无可看
    BZOJ 5467 Slay the Spire
    BZOJ 5306 [HAOI2018] 染色
    BZOJ 2784 时间流逝
    BZOJ4911: [Sdoi2017]切树游戏
    min-max 容斥
    BZOJ 5475: [WC 2019] 数树
    BZOJ 2810 [Apio2012]kunai
    Codeforces round 1083
    详解大数据数据仓库分层架构
  • 原文地址:https://www.cnblogs.com/love533/p/2419418.html
Copyright © 2020-2023  润新知