zoukankan      html  css  js  c++  java
  • P1030 求先序排列 P1305 新二叉树

      

    题目描述

    给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度le 88)。

    输入输出格式

    输入格式:

    22行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。

    输出格式:

    11行,表示一棵二叉树的先序。

    输入输出样例

    输入样例#1: 复制
    BADC
    BDCA
    
    输出样例#1: 复制
    ABCD


    虽然这是一道我做过第三次类似的题目的题了

    优化:
    可以不用print函数来打印
    直接在建树里面打印
    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define LL long long
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define inf 2147483647
    #define N 500000+50
    int zhong[N];
    int hou[N];
    
    void build(int l,int r,int l2,int r2)
    {
        if(l>r||l2>r2)return ;
        int root=hou[r2];
        int p=l;
        while(zhong[p]!=root)p++;
        int cnt=p-l;
        printf("%c",root);
        build( l, p-1,l2,l2+cnt-1);
        build(p+1,r,l2+cnt,r2-1);
    
    }
    int main()
    {
        char s[10];
        RS(s);
        rep(i,0,strlen(s))
        zhong[i]=s[i];
        RS(s);
        rep(i,0,strlen(s))
        hou[i]=s[i];
        int len=strlen(s);
        build(0,len-1,0,len-1);
    }
    View Code

    大佬的做法

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    void beford(string in,string after){
        if (in.size()>0){
            char ch=after[after.size()-1];
            cout<<ch;//找根输出
            int k=in.find(ch);
            beford(in.substr(0,k),after.substr(0,k));
            beford(in.substr(k+1),after.substr(k,in.size()-k-1));//递归左右子树;
        }
    }
    int main(){
        string inord,aftord;
        cin>>inord;cin>>aftord;//读入
        beford(inord,aftord);cout<<endl;
        return 0;
    }
    View Code
    
    

    题目描述

    输入一串二叉树,用遍历前序打出。

    输入输出格式

    输入格式:

    第一行为二叉树的节点数n。(n leq 26n26)

    后面n行,每一个字母为节点,后两个字母分别为其左右儿子。

    空节点用*表示

    输出格式:

    前序排列的二叉树

    输入输出样例

    输入样例#1: 复制
    6
    abc
    bdi
    cj*
    d**
    i**
    j**
    输出样例#1: 复制
    abdicj


    沦落为做水题了 真是尴尬
    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define LL long long
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define inf 2147483647
    #define N 200
    int l[N];
    int r[N];
    int vis[N];
    int cnt[N];
    void print(int x)
    {
        if(!x)return ;
        if(x=='*')return ;
        printf("%c",x);
        print(l[x]);
        print(r[x]);
        return ;
    }
    int main()
    {
        int n;
        RI(n);
        char s[10];
        while(n--)
        {
            RS(s);
            vis[s[0]]=1;
            vis[s[1]]=1;
            vis[s[2]]=1;
            if(s[1]!='*')
            {
                l[s[0]]=s[1];
                cnt[s[1]]++;
            }
            if(s[2]!='*')
            {
                r[s[0]]=s[2];
                cnt[s[2]]++;
            }
        }
        int root;
        rep(i,'a','z')
        if(vis[i]&&!cnt[i])
        {
            root=i;break;
        }
        print(root);
    }
    View Code












  • 相关阅读:
    vue中watch的详细用法
    Golang实现请求限流的几种办法
    观察者模式
    原创-阿里云上SLB暴露K8S服务-四层协议/七层协议
    K8S-HPA创建指南
    阿里云k8s-nas挂载指南
    非原创--mysql语言分类
    mysql命令
    MongoDB从节点支持读请求
    MongoDB用户权限管理
  • 原文地址:https://www.cnblogs.com/bxd123/p/10686614.html
Copyright © 2011-2022 走看看