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]);
            }
        }
    }
  • 相关阅读:
    第三章 运算符与表达式
    python 第二章 对象与类型
    线段树区间染色+注意事项
    ACM-ICPC北京赛区2018重现赛 A题
    删除元组
    修改元组
    访问元组
    Python 元组
    Python List sort()方法
    hdu4501——小明系列故事——买年货(多维背包)
  • 原文地址:https://www.cnblogs.com/flightless/p/8535052.html
Copyright © 2011-2022 走看看