zoukankan      html  css  js  c++  java
  • POJ 2255 Tree Recovery

      重建二叉树

      给定一棵二叉树的前序遍历和中序遍历的结果,求其后序遍历。

      输入输入可能有多组,以EOF结束。
      每组输入包含两个字符串,分别为树的前序遍历和中序遍历。每个字符串中只包含大写字母且互不重复。输出对于每组输入,用一行来输出它后序遍历结果。样例输入

      DBACEGF ABCDEFG
      BCAD CBAD
    

      样例输出

      ACBFGED
      CDAB


    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #define maxn 1001
    using namespace std;
    char s1[maxn],s2[maxn];
    int fa=0,root,n1,n2,step=0,father[maxn],chilrd[maxn][2];
    int search(int l,int r,char v)

     for(int i=l;i<=r;i++)
      if(s2[i]==v) return i;
     return -1;
    }
    void jianshu(int l,int r,int me)
    { if(me==-1) {step--;return;}
     chilrd[me][0]=search(l,me,s1[++step]);//printf("%d %d %d %d<-->%d ",l,r,me,step,chilrd[me][0]);
     jianshu(l,me,chilrd[me][0]);
     chilrd[me][1]=search(me,r,s1[++step]);//printf("%d %d %d %d>-->%d ",l,r,me,step,chilrd[me][1]);
     jianshu(me,r,chilrd[me][1]);
    }
    void dfs(int mt)

     for(int i=0;i<=1;i++)
      if(chilrd[mt][i]!=-1)
       dfs(chilrd[mt][i]);
     printf("%c",s2[mt]);
    }
    int main()
    {
     while(scanf("%s %s",s1,s2)!=EOF)
     {
      n1=strlen(s1);n2=strlen(s2);
      root=search(0,n2-1,s1[0]);
      jianshu(0,n2-1,root);
      /*for(int i=0;i<n2;i++)
      {
       printf("%d    %d     %d ",i,chilrd[i][0],chilrd[i][1]);
      }*/
      dfs(root);
      step=0;
      printf(" ");
     }
     return 0;
    }

    考查二叉树的遍历

    思路:通过先序中序找出每个点的子节点,再递归后序输出

    ***:输入需要用EOF输入
  • 相关阅读:
    【转】numpy.random.randn()与rand()的区别
    【转】numpy.random.randn()与rand()的区别
    春节一顿饭,吃懂了分布式资源调度
    春节一顿饭,吃懂了分布式资源调度
    ASP.NET 分页类 简单好用 支持 AJAX 自定义文字
    系统设计摘录CAP
    webapi上传文件
    webuploader上传工具
    Js学习文件上传
    K-means算法Java实现
  • 原文地址:https://www.cnblogs.com/xcsj/p/11939106.html
Copyright © 2011-2022 走看看