• HNUST-1047 二叉树的表示


    1047: 二叉树的表示

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 4  解决: 4
    [提交][状态][讨论版]

    题目描述

    ​DJ非常痴迷于数据结构,二叉树是他最喜欢的结构模型。这种每个顶点的度不大于2的简单的图总是能激发他的灵感。然而,二叉树的表示方法是一个困扰他已久的问题。如果用链表表示,不直观;画成图形,计算机又难以存储。好在他现在发现了一种既直观,计算机又便于存储的表示方法。该方法定义如下:
    1、如果二叉树中节点X是叶子节点,则该节点直接表示为X。
    2、如果二叉树中节点X有左子树,则该节点表示为(...)X,括号内为X的左子树。
    3、如果二叉树中节点X有右子树,则该节点表示为X(...),括号内为X的右子树。
    4、如果二叉树中节点X有左右子树,则该节点表示为(...)X(...),左边括号内为左子树,右边括号内为右子树。
    现在DJ有许多二叉树的先序序列和中序序列,DJ要你写个程序帮他把这些二叉树转换为上述表示方法。

    输入

    ​输入第一行为一个整数N,表示有N个待转换的二叉树。
    接下来有N行,每行由两个字符串组成,中间用空格分开。
    每行的第一个字符串为二叉树的先序序列,第二个字符串为二叉树的中序序列。
    输入字符串由大写字母组成,每个字母代表二叉树的一个节点,不会有两个相同的字母。
    你可以假设不会输入无效数据。

    输出

    每组数据输出占一行,输出转换后的二叉树。

    样例输入

    2
    AB AB
    ABCD BCAD
    

    样例输出

    A(B)
    (B(C))A(D)
    根据先序遍历和中序遍历建立二叉树,具体内容看我另一篇博文:http://www.cnblogs.com/Pretty9/p/7426958.html
    #pragma GCC diagnostic error "-std=c++11"
    #include <bits/stdc++.h>
    #define _ ios_base::sync_with_stdio(0);cin.tie(0);
    
    using namespace std;
    const int N = 100 + 5;
    
    char pre[N], in[N];
    void DFS(int ps, int pt, int is, int it){
        int pos = is;
        while(in[pos] != pre[ps]) pos++;
        if(pos != is){
            printf("(");
            DFS(ps + 1, ps + pos - is, is, pos - 1);
            printf(")");
        }
        printf("%c", pre[ps]);
        if(pos != it){
            printf("(");
            DFS(ps + 1 + pos - is, pt, pos + 1, it);
            printf(")");
        }
    }
    int main(){
        int T;
        scanf("%d", &T);
        while(T --){
            scanf("%s %s", pre, in);
            DFS(0, strlen(pre) - 1, 0, strlen(in) - 1);
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    [同上一堂课]小学全年级课程视频下载(含课件)
    新开一扇窗:了解下编程
    谷歌开发者工具使用分享: 法宣获取积分流程分析
    鳄鱼岛 python暴力求解
    C#调用存储过程的几种方法介绍 (转)
    C# 存储过程 输出参数不能返回 的问题?
    DataReader 分页和rownumber
    转c之练手篇——"链表"
    新建NET技术群:专业NET技术
    SQLHepler
  • 原文地址:https://www.cnblogs.com/Pretty9/p/7427004.html
Copyright © 2020-2023  润新知