zoukankan      html  css  js  c++  java
  • 二叉树重建

    摘自刘汝佳的《算法竞赛入门经典》

    PreOrder(T) =  T 的根结点 + PreOrder(T 的左子树) + PreOrder(T 的右子树);

    InOrder(T) =  InOrder(T 的左子树) + T 的根结点 + InOrder(T 的右子树);

    PostOrder(T) =  PostOrder(T 的左子树) +  PostOrder(T 的右子树) + T 的根结点;

    输入一颗二叉树的先序遍历和中序遍历,输出它的后序遍历。

    Sample Input

    DBACEGF ABCDEFG
    BCAD CBAD
    

    Sample Output

    ACBFGED
    CDAB
    
    代码
    #include<stdio.h>
    #include
    <string.h>
    void build(int n, char* s1, char* s2, char* s)
    {
    int p;
    if(n <= 0) return ;
    p
    = strchr(s2, s1[0]) - s2; //找到根结点在中序遍历中的位置
    build(p, s1+1, s2, s); //递归构造左子树的后序遍历
    build(n-p-1, s1+p+1, s2+p+1, s+p); //递归构造右子树的后序遍历
    s[n-1] = s1[0]; //把根结点添加到最后
    }

    int main()
    {
    int n;
    char s1[30], s2[30], ans[30];
    while(scanf("%s%s", s1, s2) == 2)
    {
    n
    = strlen(s1);
    build(n, s1, s2, ans);
    ans[n]
    = '\0';
    printf(
    "%s\n", ans);
    }
    }

    也可以省略build()函数的最后一个参数;

    代码
    #include<stdio.h>
    #include
    <string.h>
    void build(int n, char* s1, char* s2)
    {
    int p;
    if(n <= 0) return ;
    p
    = strchr(s2, s1[0]) - s2; //找到根结点在中序遍历中的位置
    build(p, s1+1, s2); //递归构造左子树的后序遍历
    build(n-p-1, s1+p+1, s2+p+1); //递归构造右子树的后序遍历
    printf("%c",s1[0]);
    }

    int main()
    {
    int n;
    char s1[30], s2[30];
    while(scanf("%s%s", s1, s2) == 2)
    {
    n
    = strlen(s1);
    build(n, s1, s2);
    printf(
    "\n");
    }
    }
  • 相关阅读:
    java中讲讲PrintStream的用法,举例?
    Spark Scala当中reduceByKey的用法
    springboot与ActiveMQ整合
    solr(六): 集群
    zookeeper集群
    solr(五): centos中, 整合 tomcat&solr
    springboot redis(单机/集群)
    redis 五种数据类型
    redis 集群搭建: redis-cluster
    redis 持久化
  • 原文地址:https://www.cnblogs.com/submarinex/p/1941255.html
Copyright © 2011-2022 走看看