• 九度OJ 1385 重建二叉树


    题目地址:http://ac.jobdu.com/problem.php?pid=1385

    题目描述:

    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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”。

    样例输入:
    81 2 4 7 3 5 6 84 7 2 1 5 3 8 681 2 4 7 3 5 6 84 1 2 7 5 3 8 6
    样例输出:
    7 4 2 5 8 6 3 1 No

    采用递归重建二叉树

    #include <stdio.h>
    
    #define MAX 1000
    
    int to_post(int pre[], int in[], int post[], int n){
        int i;
        int flag1, flag2;
    
        if (n <= 0)
            return 1;
    
        for (i=0; i<n; ++i)
            if (in[i] == pre[0])
                break;
        if (i >= n)
        	return 0;
        post[n-1] = pre[0];
        flag1 = to_post (pre+1, in, post, i);
        flag2 = to_post (pre+i+1, in+i+1, post+i, n-i-1);
        return flag1 && flag2;
    }
    
    int main(void){
        int pre[MAX], in[MAX], post[MAX];
        int n, i;
    
        while (scanf ("%d", &n) != EOF){
            for (i = 0; i < n; ++i)
            	scanf("%d", &pre[i]);
            for (i = 0; i < n; ++i)
            	scanf("%d", &in[i]);
            if (to_post (pre, in, post, n)){
            	for (i = 0; i < n; ++i)
            		printf("%d ", post[i]);
            	putchar('
    ');
            }
            else
            	printf("No
    ");
        }
    
        return 0;
    }
    



  • 相关阅读:
    DATAX windows下安装及csv文件导入mysql简单案例
    JAVA质量属性之易用性战术分析
    以《淘宝网》为例,描绘质量属性的六个常见属性场景
    14 得到相关连的热词数据
    13 信息领域热词分析部分功能展示
    12 所学和感受
    从Android开发看MVC
    论面向服务架构(SOA)设计及其应用
    GitHub上快速创建文件夹
    GitHub将私有库(private)、公有库(public)相互转换
  • 原文地址:https://www.cnblogs.com/liushaobo/p/4373742.html
Copyright © 2020-2023  润新知