zoukankan      html  css  js  c++  java
  • 天梯 L2 树的遍历(已知后序中序求层序)

    树的遍历 (25 分)

    给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

    输入格式:

    输入第一行给出一个正整数N(30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。

    输出格式:

    在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

    输入样例:

    7
    2 3 1 5 7 6 4
    1 2 3 4 5 6 7
    

    输出样例:

    4 1 6 3 5 7 2


    解题思路:
      就是直接通过遍历后序和中序依次找根结点,将求得的序列存入数组就得到了层序遍历。
    #include<bits/stdc++.h>
    #define ll long long
    #define eps 1e-8
    using namespace std;
    const int N = 1e5+5;
    const int INF = 0x3f3f3f3f;
    int n,hou[50],in[50];
    vector <int> ans(10000,-1);
    void work(int root,int s,int e,int index){
        if (s>e) return;
        int i=s;
        while(i<e && in[i]!=hou[root]) i++;
        ans[index] = hou[root];
        work(root-1-e+i,s,i-1,index*2+1);
        work(root-1,i+1,e,index*2+2);
    }
    int main(){
        scanf("%d",&n);
        for (int i=0;i<n;i++) scanf("%d",&hou[i]);
        for (int i=0;i<n;i++) scanf("%d",&in[i]);
        work(n-1,0,n-1,0);
        int cnt = 0;
        for(int i=0;i<ans.size();i++){
            if(ans[i]!=-1 && cnt!=n-1) {
                printf("%d ",ans[i]);
                cnt++;
            }else if (ans[i]!=-1){
                printf("%d
    ",ans[i]);
                break;
            }
        }
        return 0;
    }
    View Code
    
    
  • 相关阅读:
    子数组的最大乘积
    重建二叉树
    只考加法的面试题
    找出发帖的水王问题
    寻找最近点对
    寻找最大的k个数问题
    寻找数组中 的最大值最小值
    数组中的最长递增子序列
    常用的百度API地图操作
    div 背景自适应
  • 原文地址:https://www.cnblogs.com/l999q/p/10593201.html
Copyright © 2011-2022 走看看