zoukankan      html  css  js  c++  java
  • 二叉树三种遍历的相互转换

    1.已知先序中序求后序

        只要掌握各个遍历的特点,就能轻松解决问题 先序:给定了根的遍历顺序 中序:根的左右两边分别为左子树和右子树 所以可以通过控制根的位置 递归进入左子树和右子树 控制格式输出即可

        

    #include <bits/stdc++.h>
    #define N 1005
    using namespace std;
    int a[N];int b[N];
    int n;
    void dfs(int l,int r,int size){
        if(size==0) return ;
        int i;
        for(i=1;i<=size;i++){
            if(a[l]==b[i+r-1]) break;
        }
        dfs(l+1,r,i-1);
        dfs(l+i,i+r,size-i);
        if(size==n) printf("%d
    ",a[l]);
        else printf("%d ",a[l]);
    }
    int flag;
    int main(){
        while(scanf("%d",&n)==1){
            for(int i=1;i<=n;i++) scanf("%d",&a[i]);
            for(int i=1;i<=n;i++){
                scanf("%d",&b[i]);
            }
            dfs(1,1,n);
        }
        return 0;
    }
    

     2.已知中序后序求前序

       可以根据左子树的个数在中序和后序中相等的规则 可以确定进入左子树的根的位置 而进入右子树的根的位置则为前一个根的位置-1 然后递归进行即可

       

    #include <bits/stdc++.h>
    #define N 1005
    using namespace std;
    int a[N];int b[N];
    int n;
    void dfs(int l,int r,int size){
        if(size==0) return ;
        if(size==n) printf("%d",a[l]);
        else printf(" %d",a[l]);
        int i;
        for(i=1;i<=size;i++){
            if(a[l]==b[r+i-1]) break;
        }
        dfs(l-(size-i+1),r,i-1);
        dfs(l-1,r+i,size-i);
    }
    int flag;
    int main(){
          while(scanf("%d",&n)==1){
          for(int i=1;i<=n;i++) scanf("%d",&a[i]);
            for(int i=1;i<=n;i++){
               scanf("%d",&b[i]);
           }
            dfs(n,1,n);
            printf("
    ");
        }
        return 0;
    }
    

      

  • 相关阅读:
    C# WebApi 获取客户端ip地址
    C# 构造函数快捷键
    2 .SHELL 5~10节
    Spring项目集成apidoc生成api接口文档
    根据域名查找对应的ip及端口
    高质量SQL的30条建议
    1 .shell编程1~5
    CentOS7安装mysql8
    编译安Apache2.4.43报错checking for APR... no configure: error: APR not found. Please read the documentation.
    rm -rf * 的正确用法
  • 原文地址:https://www.cnblogs.com/wang9897/p/7835404.html
Copyright © 2011-2022 走看看