• 根据二叉树的中序遍历和层次遍历还原二叉树


    问题 C: 还原二叉树

    时间限制: 1 Sec
    内存限制: 128 MB
    提交: 322
    解决: 153

    题目描述

    给一棵二叉树的层序遍历序列和中序遍历序列,求这棵二叉树的先序遍历序列和后序遍历序列。

    输入

    每个输入文件中一组数据。

    第一行一个正整数N(1<=N<=30),代表二叉树的结点个数(结点编号为1~N)。接下来两行,每行N个正整数,分别代表二叉树的层序遍历序列和中序遍历序列。数据保证序列中1~N的每个数出现且只出现一次。

    输出

    输出两行,每行N个正整数,分别代表二叉树的先序遍历序列和后序遍历序列。每行末尾不输出额外的空格。

    样例输入

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

    样例输出

    3 5 2 4 6 7 1
    2 5 6 1 7 4 3
     
    解题思想:
    习惯通过静态的方式来处理树的问题了。整个过程相当于模拟二叉树的层次遍历将二叉树还原出来,最后对其进行遍历。
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #define MAXN 100
     5 using namespace std;
     6 typedef struct Node{
     7     int v,L,R;
     8     Node(){v=L=R=-1;}
     9 }Node;
    10 Node node[MAXN];
    11 int lt[MAXN],it[MAXN],flag[MAXN],a;
    12 void pro(int x){
    13     if(a==0){
    14         printf("%d",node[x].v);
    15         a=1;
    16     }else{
    17         printf(" %d",node[x].v);
    18     }
    19     if(node[x].L!=-1){
    20         pro(node[x].L);
    21     }
    22     if(node[x].R!=-1){
    23         pro(node[x].R);
    24     }
    25 }
    26 void post(int x){
    27     if(node[x].L!=-1){
    28         post(node[x].L);
    29     }
    30     if(node[x].R!=-1){
    31         post(node[x].R);
    32     }
    33     if(a==0){
    34         printf("%d",node[x].v);
    35         a=1;
    36     }else{
    37         printf(" %d",node[x].v);
    38     }
    39 }
    40 int main()
    41 {
    42     int n;
    43     scanf("%d",&n);
    44     for(int i=0;i<n;i++)
    45         scanf("%d",&lt[i]);
    46     for(int i=0;i<n;i++)
    47         scanf("%d",&it[i]);
    48 
    49     memset(flag,0,sizeof(flag));
    50     int index1,index2;
    51     index1=index2=0;
    52     for(int i=0;index1<n;){
    53         if(node[index1].v==-1){
    54             node[index1].v=lt[i++];
    55         }
    56         int c=0;
    57         while(node[index1].v!=it[c])
    58             c++;
    59         flag[c]=1;
    60         if(c>0&&flag[c-1]!=1){
    61             node[index1].L=i;
    62             node[i].v=lt[i++];
    63             c=0;
    64             while(node[index1].v!=it[c])
    65             c++;
    66             flag[c]=1;
    67         }
    68         if(c<n-1&&flag[c+1]!=1){
    69             node[index1].R=i;
    70             node[i].v=lt[i++];
    71             c=0;
    72             while(node[index1].v!=it[c])
    73             c++;
    74             flag[c]=1;
    75         }
    76         index1++;
    77     }
    78     a=0;
    79     pro(0);
    80     printf("
    ");
    81     a=0;
    82     post(0);
    83     printf("
    ");
    84     //for(int i=0;i<n;i++)
    85     //    printf("%d %d %d
    ",node[i].v,node[i].L,node[i].R);
    86     return 0;
    87 }
    我要坚持一年,一年后的成功才是我想要的。
  • 相关阅读:
    1、VS2005(c/c++)外壳扩展编程之windows右键菜单(1)
    17、C/C++编程规范精述
    2、JSON基础知识总结(2)
    2、VS2005(c/c++)外壳扩展编程之windows右键菜单(2)
    【转】VMware Workstation 8.0.1 build528992精简绿色版
    【技术贴】笔记本触摸板不灵敏|取消笔记本插入外置鼠标自动关闭触摸板鼠标
    【技术贴】解决开机本地连接出来慢,本地连接开机后出来时间慢
    【技术贴】笔记本插入外置鼠标自动关闭触摸板鼠标
    【转】html背景设置
    【技术贴】java插入mysql中文乱码解决|java插入mysql数据库显示问号?
  • 原文地址:https://www.cnblogs.com/tianxia2s/p/6483121.html
Copyright © 2020-2023  润新知