• 数据结构上机测试4.1:二叉树的遍历与应用1【根据二叉树的前序序列和中序序列求后序序列方法1,2】


     

    数据结构上机测试4.1:二叉树的遍历与应用1

    Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

    题目描述

    题目链接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1291

    输入二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列。

    输入

    第一行输入二叉树的先序遍历序列;
    第二行输入二叉树的中序遍历序列。

    输出

    输出该二叉树的后序遍历序列。

    示例输入

    ABDCEF
    BDAECF

    示例输出

    DBEFCA

    基本原理不再详细介绍,方法有二(原理一模一样,但是前者比较麻烦,但是更为直观易懂):
    代码1:
     1 #include<iostream>
     2 #include<stdlib.h>
     3 #include<stdio.h>
     4 #include<string.h>
     5 using namespace std;
     6 typedef struct vode
     7 {
     8     char date;
     9     struct vode *l,*r;
    10 }bitree;
    11 void getpreordertraverse(bitree *&root,char pre[],char in[],int ps,int s,int n);
    12 void postordertraverse(bitree *root);
    13 int main()
    14 {
    15     int zong ;
    16     {
    17         char pre[100],in[100];
    18         cin>>pre>>in;
    19         int len=strlen(pre);
    20         bitree *root;
    21         getpreordertraverse(root,pre,in,0,0,len);
    22         postordertraverse(root);
    23         cout<<endl;
    24     }
    25     return 0;
    26 }
    27 void getpreordertraverse(bitree *&root,char pre[],char in[],int ps,int s,int n)
    28 {
    29       if(n==0)root=NULL;
    30       else 
    31       {
    32           root=(bitree *)malloc(sizeof(bitree));
    33           root->date=pre[ps];
    34           int k;
    35           for(k=s;k<=s+n-1;k++)
    36               if(in[k]==pre[ps])
    37                   break;
    38           getpreordertraverse(root->l,pre,in,ps+1,s,k-s); 
    39           getpreordertraverse(root->r,pre,in,ps+1+(k-s),k+1,n-(k-s)-1);
    40       }
    41 }
    42 void postordertraverse(bitree *root)
    43 {
    44     if(root)
    45     {
    46         postordertraverse(root->l);
    47         postordertraverse(root->r);
    48         cout<<root->date;
    49     }
    50     else return ;
    51 }
    View Code

    以上代码中需要特别注意的事项:getpreordertraverse()函数中的参数bitree *&root,root前面的&一定不能省略:调用函数getpreorderteraverse的目的就是建立先序树,然后再对树后序遍历,得到结果。如果没有&的话,主函数中的root指针仍然是个野指针,后序遍历的时候一定会出错,况且通过调用getpreordertraverse函数建不起来树,虽然各个节点都已经存入内存,但是各节点之间并没有联系,只是由一个一个的单个的节点组成。

    代码二:

     1 #include<iostream>
     2 #include<stdlib.h>
     3 #include<stdio.h>
     4 #include<string.h>
     5 using namespace std;
     6 typedef struct vode
     7 {
     8     char date;
     9     struct vode *l,*r;
    10 }bitree;
    11 void postordertraverse(bitree *root);
    12 bitree *getpreordertraverse(char *pre,char *in,int len);
    13 int main()
    14 {
    15     int zong ;
    16     {
    17         char pre[100],in[100];
    18         cin>>pre>>in;
    19         int len=strlen(pre);
    20         bitree *root;
    21         root=getpreordertraverse(pre,in,len);
    22         postordertraverse(root);
    23         cout<<endl;
    24     }
    25     return 0;
    26 }
    27 void postordertraverse(bitree *root)
    28 {
    29     if(root)
    30     {
    31         postordertraverse(root->l);
    32         postordertraverse(root->r);
    33         cout<<root->date;
    34     }
    35     else return ;
    36 }
    37 bitree *getpreordertraverse(char *pre,char *in,int len)
    38 {
    39     if(len==0)return NULL;
    40     else 
    41     {
    42         bitree *root=(bitree *)malloc(sizeof(bitree));
    43         root->date=*pre;
    44         char *p;
    45         for(p=in;p!=NULL;p++)
    46         if(*p==*pre)
    47             break;
    48         int k=p-in;
    49         root->l=getpreordertraverse(pre+1,in,k);
    50         root->r=getpreordertraverse(pre+k+1,in+k+1,len-k-1);
    51         return root;
    52     }
    53 }
    View Code

    代码分析:

    第二个代码很巧妙的运用了指针的性质,使得参数数量由第一个代码中6个变成了第二个代码中的3个,代码更为简洁:getpreordertraverse()函数成为有返回值的函数,这就可以省略掉第一个代码参数列表中的bitree *&root变量,通过*pre和*in这样就把char pre[] 和ps与char in[]和s合二为一,就是用*pre代替char pre[]和ps,用*in代替char in[]和s,由此可见,代码1和代码2其实本就是一个代码,代码2是代码1的进化版。 



  • 相关阅读:
    C#/.NET CTS和CLS:公共类型系统和公共语言规范
    MongoDB分布式集群架构(3种模式)
    Elastic Search 入门
    转:计算机视觉部分会议/期刊名称缩写
    神经网络模型的参数量和FLOPs的计算,torchstat,thop,循环神经网络RNN
    latex自己调配颜色
    latex图像和表格手动设置位置(清除自动寻找位置)
    转:图像泊松融合
    latex调整表格行高、列宽和表格整体的左右宽度
    转:目标检测评价标准mAP
  • 原文地址:https://www.cnblogs.com/kuangdaoyizhimei/p/3413381.html
Copyright © 2020-2023  润新知