zoukankan      html  css  js  c++  java
  • 九度oj题目1385:重建二叉树

    题目1385:重建二叉树

    时间限制:1 秒

    内存限制:32 兆

    特殊判题:

    提交:4419

    解决:1311

    题目描述:

    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。

    输入:

    输入可能包含多个测试样例,对于每个测试案例,

    输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点个数。

    输入的第二行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的前序遍历序列。

    输入的第三行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的中序遍历序列。

    输出:

    对应每个测试案例,输出一行:

    如果题目中所给的前序和中序遍历序列能构成一棵二叉树,则输出n个整数,代表二叉树的后序遍历序列,每个元素后面都有空格。

    如果题目中所给的前序和中序遍历序列不能构成一棵二叉树,则输出”No”。

    样例输入:
    8
    1 2 4 7 3 5 6 8
    4 7 2 1 5 3 8 6
    8
    1 2 4 7 3 5 6 8
    4 1 2 7 5 3 8 6
    
    样例输出:
          7 4 2 5 8 6 3 1 
          No
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <string>
     4 #include <queue>
     5 #include <stack>
     6 #include <iostream>
     7 using namespace std;
     8 int pre[1005],in[1005],beh[1005],num;
     9 bool behfind(int ps,int pe,int is,int ie){//这个模式可以套用
    10     if(pe-ps!=ie-is)//长度不符合
    11         return false;
    12     int fir=pre[ps];//首数字
    13     int i;
    14     for(i=is;i<=ie;i++){
    15         if(in[i]==fir){
    16             break;
    17         }
    18     }
    19     if(i>ie){//未找到
    20         return false;
    21     }
    22     bool b1=true,b2=true;
    23     //二叉树中,关于左右子树,一定要分开判断!!
    24     if(i>is)//左子树存在
    25     b1=behfind(ps+1,ps+i-is,is,i-1);
    26     if(i<ie)//右子树存在
    27     b2=behfind(ps+i-is+1,pe,i+1,ie);
    28     beh[num++]=fir;
    29     return b1&&b2;
    30 }
    31 int main(){
    32     //freopen("D:\INPUT.txt","r",stdin);
    33     int n;
    34     while(scanf("%d",&n)!=EOF){
    35         int i,j;
    36         num=0;
    37         for(i=0;i<n;i++){
    38             scanf("%d",&pre[i]);
    39         }
    40         for(i=0;i<n;i++){
    41             scanf("%d",&in[i]);
    42         }
    43         if(behfind(0,n-1,0,n-1)){
    44             for(i=0;i<n;i++){
    45                 printf("%d ",beh[i]);
    46             }
    47             printf("
    ");
    48         }
    49         else{
    50             printf("No
    ");
    51         }
    52     }
    53     return 0;
    54 }

    网上别人的代码,可以借鉴:

     1 #include <stdio.h>
     2 
     3 #define MAX 1000
     4 
     5 int to_post(int pre[], int in[], int post[], int n){
     6     int i;
     7     int flag1, flag2;
     8 
     9     if (n <= 0)
    10         return 1;
    11 
    12     for (i=0; i<n; ++i)
    13         if (in[i] == pre[0])
    14             break;
    15     if (i >= n)
    16         return 0;
    17     post[n-1] = pre[0];
    18     flag1 = to_post (pre+1, in, post, i);
    19     flag2 = to_post (pre+i+1, in+i+1, post+i, n-i-1);
    20     return flag1 && flag2;
    21 }
    22 
    23 int main(void){
    24     int pre[MAX], in[MAX], post[MAX];
    25     int n, i;
    26 
    27     while (scanf ("%d", &n) != EOF){
    28         for (i = 0; i < n; ++i)
    29             scanf("%d", &pre[i]);
    30         for (i = 0; i < n; ++i)
    31             scanf("%d", &in[i]);
    32         if (to_post (pre, in, post, n)){
    33             for (i = 0; i < n; ++i)
    34                 printf("%d ", post[i]);
    35             putchar('
    ');
    36         }
    37         else
    38             printf("No
    ");
    39     }
    40 
    41     return 0;
    42 }
  • 相关阅读:
    在Oracle中添加用户 赋权 修改暗码 解锁
    Ubuntu Linux 8.04 Vsftp 假造用户设置
    用一个实例讲解DB2数据库游标轮回的成果
    解说Oracle数据库自动增长列的完成过程
    MSN登录错误“80072efd”解决办法
    再学 GDI+[61]: 路径画刷(1) SetCenterColor、SetSurroundColors
    WinAPI: 测试 BitBlt
    两个 CopyRect
    再学 GDI+[58]: 路径 保存与读取路径数据
    再学 GDI+[62]: 路径画刷(2) SetCenterPoint、GetCenterPoint
  • 原文地址:https://www.cnblogs.com/Deribs4/p/4647603.html
Copyright © 2011-2022 走看看