uva 10562 - Undraw the Trees

简介: 点击打开链接 题目意思:  给定一个多叉树的图,要求把图转化为一颗树,最后输出相应的内容。 解题思路:  1 建树 + 前序遍历输出 。这题的输入就是一个很麻烦的事了,我是采用一个二维的char数组来存储读入的图,但是建树的过程我花了一天的时间一直没有成功,不懂为什么(本人比较菜逼)                     2 递归输出 。

点击打开链接

题目意思:  给定一个多叉树的图,要求把图转化为一颗树,最后输出相应的内容。

解题思路:  1 建树 + 前序遍历输出 。这题的输入就是一个很麻烦的事了,我是采用一个二维的char数组来存储读入的图,但是建树的过程我花了一天的时间一直没有成功,不懂为什么(本人比较菜逼)

                    2 递归输出 。对于题目的输入其实就是一颗已经建好的树,我么只需要去找到对应的子树然后搜索去输出即可,学会使用递归很重要,可以很简便的写出代码

代码:

//题目给的一个图其实就是树了,那么我们就不用去建树了,建树是个很繁琐的事情,那么我们知道对于这颗树,我么可以去搜素它,如果遇到有子树就继续往下去搜索直到叶子节点,一个dfs就可以(注意这一题的子树最多有200个,那么我们必须一个一个的找到左边的位置和右边的位置,否则出错)。1 注意输入的字符是所有的ASCII字符,2 还要注意有可能是空树的情况 3 左括号等于右括号,对于叶子节点后面是一个();
#include <iostream>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <cstdlib>
using namespace std;
const int MAXN = 250;

int t, cnt, flag;
char G[MAXN][MAXN];

//初始化函数(避免后面可能会越界用到前面的数据,那么只要初始化为空格即可)
void init(){
    for(int i = 0 ; i < MAXN ; i++){
        for(int j = 0 ; j < MAXN ; j++)
            G[i][j] = ' ';
    }
}
//判断当前节点是否满足
int judge(char c) {
    if (c != '-' && c != '|' && c != ' ')//只要不是这三个字符均满足条件
        return 1;
    return 0;
}

//递归输出这颗树
void dfs(int k, int l, int r) {//k是第k行,l是左边的起始点,r是右边的终点
    if (k < cnt) {//k满足条件才递归
        int i, j;
        printf("(");//先大印一个“("
        for (i = l ; i <= r && i < strlen(G[k]) ; i++) {//从左边到右边去遍历子树
            if (judge(G[k][i])) {//满足条件前提
                printf("%c", G[k][i]);//打印字母
                if (G[k+1][i] == '|') {//判断是否有子树
                    for (j = i ; G[k+2][j] == '-' && j > 0 ; j--);//找子树的左边起点
                    int templ = j;
                    for (j = i ; G[k+2][j] == '-' && j < strlen(G[k+2])-1 ; j++);//找子树的右边终点
                    int tempr = j;
                    dfs(k + 3, templ, tempr);//继续搜索子树       
                } 
                else
                    printf("()");//如果没有子树说明到了叶子节点,那么要输出一个“()”;
            }
        }
        printf(")");//遍历完一颗子树就要输出“)”
    }
}

//输入处理以及函数的调用
int main() {
    //freopen("input.txt", "r", stdin);
    scanf("%d%*c", &t);
    while (t--) {
        int i = 0;
        init();
        while (gets(G[i])) {
            if (G[i][0] == '#') break;
            ++i;
        }
        cnt = i;       
        if (cnt == 0)//如果是空树就输出()即可
            printf("()\n");
        else {
            dfs(0, 0, strlen(G[0])-1);//递归调用,开始的左边是0  右边是strlen(G[0]-1);
            printf("\n");
        }
    }
    return 0;
}




目录
相关文章
|
9月前
|
数据挖掘 数据处理 开发者
Pandas高级数据处理:实时数据处理
本文介绍了Pandas在实时数据处理中的应用,涵盖基础概念、常见问题及解决方案。Pandas是Python中强大的数据分析库,支持流式读取和增量更新数据,适用于大规模数据集的处理。通过分块读取、数据类型优化等方法,可有效解决内存不足等问题。文中还提供了代码示例,帮助读者更好地理解和掌握Pandas在实时数据处理中的使用技巧。
219 15
|
11月前
提升个人工作技能
提升个人工作技能
1166 6
|
运维 Serverless PHP
Serverless 应用引擎产品使用合集之在部署Laravel时,如何处理伪静态
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
安全 Linux 网络安全
【专栏】Linux 网络扫描工具:一起开始nmap的探索之旅吧!
【4月更文挑战第28天】nmap, 开源网络扫描工具,用于探测主机、网络信息,包括开放端口、服务类型、OS等。本文分三部分介绍:1) nmap简介与基本原理;2) 使用方法和高级技巧,如脚本扩展;3) 实际应用,如网络安全评估、系统管理和渗透测试。学习nmap需注意合规性,持续探索新技巧,以提升网络管理与安全能力。一起开始nmap的探索之旅吧!
475 0
|
安全 数据库连接
FastApi-20-依赖注入
FastApi-20-依赖注入
420 0
|
缓存 运维 负载均衡
架构动静分离和分布式阶段——阿里云 MVP乔锐杰
乔锐杰,上海驻云运维总监,江湖人称“乔帮主”。本文是乔帮主在阿里云的直播中分享《阿里云千万级架构的构建——架构的成长演变之路》的第三部分。
2205 1
架构动静分离和分布式阶段——阿里云 MVP乔锐杰
|
机器学习/深度学习 人工智能 运维
|
存储 弹性计算 Cloud Native
从搜索引擎到核心交易数据库,详解阿里云神龙如何支撑双11
订单峰值58.3万笔/秒,销售额4982亿,阿里云神龙再次成功扛住了全球流量洪峰
从搜索引擎到核心交易数据库,详解阿里云神龙如何支撑双11
|
负载均衡 5G 调度
关键技术 二:LTE-A CA | 带你读《5G UDN(超密集网络)技术详解》之十一
本章节进一步详细解释 LTE 小小区相关的关键技术之二:LTE-A CA,并且关联着说明它们对后续 5G NR 小小区的基线性影响和适用情况。
关键技术 二:LTE-A CA | 带你读《5G UDN(超密集网络)技术详解》之十一