• 有关二叉树的三序遍历的题目


    首先是给出先序中序求后序

    #include<cstdio>
    const int maxn=1111;
    int pre[maxn],in[maxn],post[maxn];
    int n;
    void getpost(int pa,int pb,int ia,int ib,int la,int lb)//1,n,1,n,1,n
    {
        if(pa>pb||ia>ib||la>lb) return;
        int a,i=ia;
        while(in[i]!=pre[pa]) ++i;
        a=i-ia;
        post[lb]=pre[pa];
        getpost(pa+1,pa+a,ia,i-1,la,la+a-1);
        getpost(pa+a+1,pb,i+1,ib,la+a,lb-1);
    }
    int main()
    {
        while(scanf("%d",&n)!=EOF)
        {
            for (int i=1;i<=n;i++)
                scanf("%d",&pre[i]);
            for (int i=1;i<=n;i++)
                scanf("%d",&in[i]);
            getpost(1,n,1,n,1,n);
            for (int i=1;i<n;i++)
                printf("%d ",post[i]);
            printf("%d
    ",post[n]);
        }
        return 0;
    }
    对于给定的一个二叉树的先序遍历和后序遍历,输出有多少种满足条件的二叉树。
    两棵二叉树不同当且仅当对于某个x,x的左儿子编号不同或x的右儿子编号不同。
    Input
    第一行一个正整数n(3<=n<=10000),表示二叉树的节点数,节点从1到n标号。
    第二行n个整数a[i](1<=a[i]<=n),表示二叉树的先序遍历。
    第三行n个整数b[i](1<=b[i]<=n),表示二叉树的后序遍历。
    Output
    输出一个整数表示有多少种方案。保证至少有1种方案。
    Input示例
    3
    1 2 3
    2 3 1
    Output示例
    1
    考虑一个有两个儿子的节点X,令X的左儿子为L,右儿子为R
    则X子树的先序遍历和后序遍历类似下图
    先序遍历 X L ... R ...
    后序遍历 ... L ... R X
    可以发现我们可以轻松地找出两个儿子从而确定树的形态。
    只有一个儿子的话这个儿子既可以是左儿子也可以是右儿子。
    只需要统计有一个儿子的节点数量即可。
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int a[10086];
    int link[10086],ans,n;
    int num[1700];
    inline void print(int i)
    {
        if(num[i+1]!=-1) print(i+1);
        printf("%d",num[i]);
    }
    inline int read()
    {
        int X=0,w=1; char ch=0;
        while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}
        while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();
        return X*w;
    }
    int main()
    {
        scanf("%d",&n);
        ans=0;
        for(int i=0; i<n; ++i) a[i]=read();
        for(int i=0; i<n-1; ++i) link[a[i]]=a[i+1];
        for(int i=0; i<n; ++i) a[i]=read();
        for(int i=0; i<n-1; ++i) if(link[a[i+1]]==a[i]) ++ans;
        memset(num,-1,sizeof(num));
        num[0]=1;
        for(int i=1; i<=ans; ++i)
        {
            int jin=0,k;
            for(k=0; num[k]!=-1; ++k)
            {
                int ct=num[k];
                num[k]=(ct*2+jin)%10,jin=(ct*2+jin)/10;
            }
            num[k]=jin==0?-1:jin;
        }
        print(0);
        puts("");
    }
    import java.util.*;
    import java.math.*;
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int n,ans=0;
            int[] a=new int[10086],link=new int[10086];
            n=sc.nextInt();
            for(int i=0; i<n; ++i) a[i]=sc.nextInt(); 
            for(int i=0; i<n-1; ++i) link[a[i]]=a[i+1];
            for(int i=0; i<n; ++i) a[i]=sc.nextInt();
            for(int i=0; i<n-1; ++i) if(link[a[i+1]]==a[i]) ++ans;
            BigInteger s=BigInteger.valueOf(1),base=BigInteger.valueOf(2);
            for(int i=1;i<=ans;++i) s=s.multiply(base);
            System.out.println(s);
    }
    }
  • 相关阅读:
    Nginx 重定向 伪静态 rewrite index.php
    centos安装lnmp
    spring @RequestBody 和 @RequestParams 同时使用
    idea 设置加载多个资源文件,显示本地图片
    阿里云栖社区dubbo 资源整理
    idea npm 调试报错解决办法
    git 设置了ssh key 还是需要输入账户和密码
    zookeeper系列 (第一章 :ubuntu 下安装zookeeper)
    linux 下node升级
    解决spring http输入流和输出流只能读取一次
  • 原文地址:https://www.cnblogs.com/mfys/p/7475158.html
Copyright © 2020-2023  润新知