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");
    }
    }
  • 相关阅读:
    执行游戏时出现0xc000007b错误的解决方法
    html中#include file的使用方法
    使用ServletFileUpload实现上传
    java环境变量配置
    微软之左旋转字符串
    Ubuntu下很给力的下载工具
    hibernate官方新手教程 (转载)
    mssql数据库游标批量改动符合条件的记录
    PageRank算法
    Myeclipse7.5 下载 安装 注冊 注冊码 100%成功
  • 原文地址:https://www.cnblogs.com/submarinex/p/1941255.html
Copyright © 2011-2022 走看看