• 二叉树知道前序、中序求后序序列


     思路:

    【1】根据前序性质,每一颗子树的前序第一个节点永远是其根节点(后序也有类似性质,所以知道后序中序求前序是一个道理)。

    【2】根据中序性质,在中序序列中,某节点之前的节点全在其左边,反之在其右边。

    那么我们在前序序列中找到当前树根节点时,再在中序序列中找到树根节点的位置,那么知道中序序列中,在根节点以前的节点都是其左子树,之后的是右子树,这样就可以递归建这两棵树,这里我们选择直接打印后序序列,打印顺序为递归左子树,递归右子树,打印自身。

    代码如下:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <vector>
    using namespace std;
    
    vector<int> ans;
    vector<int> v1,v2;
    
    void dfs(int a,int b,int cnt) {
        if(cnt == 1) {
            ans.push_back(v1[a]);
            return;
        }
        else if(cnt <= 0) return;
        int i;
        for(i=0;v1[a] != v2[b+i];i++);
        dfs(a+1,b,i);
        dfs(a+i+1,b+i+1,cnt-i-1);
        ans.push_back(v1[a]);
        return;
    }
    
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF) {
            v1.clear();
            v2.clear();
            ans.clear();
            int num;
            for(int i=0;i<n;i++) {
                scanf("%d",&num);
                v1.push_back(num);
            }
            for(int i=0;i<n;i++) {
                scanf("%d",&num);
                v2.push_back(num);
            }
            dfs(0,0,n);
            printf("%d",ans[0]);
            for(int i=1;i<ans.size();i++)
                printf(" %d",ans[i]);
            puts("");
        }
        return 0;
    }
  • 相关阅读:
    LeetCode
    LeetCode
    136. Single Number
    485. Max Consecutive Ones
    THinkPHP的认识
    MySql的简单数据类型区别与认识
    关于数据库中字符串类型的区别与使用方法
    关于数据库的建立以及表格的建立
    关于xampp集成开发环境的建立与初步认识
    如何关闭SQL进程
  • 原文地址:https://www.cnblogs.com/whatbeg/p/5267582.html
Copyright © 2020-2023  润新知