zoukankan      html  css  js  c++  java
  • PAT1020 (已知中序,后序遍历转前序遍历)

    已知后序与中序输出前序(先序):
    后序:3, 4, 2, 6, 5, 1(左右根)
    中序:3, 2, 4, 1, 6, 5(左根右)

    已知一棵二叉树,输出前,中,后时我们采用递归的方式。同样也应该利用递归的思想:

    对于后序来说,最后一个节点肯定为根。在中序中可以找到左子树的个数,那么就可以在后序中找到左子树的根;同理也可以找到右子树。

    void pre(int root, int start, int end) {
        if(start > end) return ;
        int i = start;
        while(i < end && in[i] != post[root]) i++;
        printf("%d ", post[root]);
        pre(root - 1 - end + i, start, i - 1);
        pre(root - 1, i + 1, end);
    }

    如果想要按照层次输出数,那么我们可以增加一个index变量,来存储结点。根节点为0,左子树为index*2+1, 右子树为index*2+2,那么我们按顺序输出不是-1的节点即可

    #include<iostream>
    #include<cstdio>
    #include<vector>
    using namespace std;
    vector<int>lever(100000,-1),post,in;
    int n;
    void pre(int root,int start,int end,int index)
    {
        if(start>end)
            return;
        int i=start;
        while(i<end&&in[i]!=post[root])
            i++;
        lever[index]=post[root];
        pre(root-end+i-1,start,i-1,index*2+1);
        pre(root-1,i+1,end,index*2+2);
    }
    int main()
    {
        scanf("%d",&n);
        post.resize(n+1);
        in.resize(n+1);
        for(int i=1;i<=n;i++)
            scanf("%d",&post[i]);
        for(int i=1;i<+n;i++)
            scanf("%d",&in[i]);
        pre(n,1,n,0);
        int cnt=0;
        for(int i=0;i<lever.size();i++)
        {
            if(lever[i]!=-1)
            {
                cnt++;
                if(cnt==n)
                {
                    printf("%d
    ",lever[i]);
                    break;
                }
                else
                    printf("%d ",lever[i]);
            }
        }
    }
  • 相关阅读:
    Java Native Method
    SQL语句优化
    Ibatis的环境搭建以及遇到的问题解决
    Java 构建器
    SpringMVC自定义视图 Excel视图和PDF视图
    java 枚举的常见使用方法
    mysql 根据某些字段之和排序
    MFC The Screen Flickers When The Image Zoomed
    How To Debug Qmake Pro File
    Gcc And MakeFile Level1
  • 原文地址:https://www.cnblogs.com/flightless/p/8535052.html
Copyright © 2011-2022 走看看