• 二叉树重建


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

    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");
    }
    }
  • 相关阅读:
    网页的资源加载优化
    Object.prototype.toString的应用
    判断一个字符串中出现次数最多的字符,并统计字数
    toString()和toLocaleString()有什么区别
    响应式网站布局要适应的当下主流手机屏幕的各个版本的分辨率有哪些(media query)
    handlebars用法
    算符优先分析及其简单代码实现
    OpenGL:使用顶点数组法绘制正六面体
    算法设计:两种快速排序代码实现
    c#简易学生信息管理系统
  • 原文地址:https://www.cnblogs.com/submarinex/p/1941255.html
Copyright © 2020-2023  润新知