洛谷 P1305:新二叉树 ← DFS + 字符索引数组 + map

​【题目来源】
https://www.luogu.com.cn/problem/P1305

【题目描述】
输入一串二叉树,输出其前序遍历。

【输入格式】
第一行为二叉树的节点数 n。(1≤n≤26)
后面 n 行,第一个字母为节点,后两个字母分别为其左右儿子。特别地,数据保证第一行读入的节点必为根节点。
空节点用 * 表示。

【输出格式】
二叉树的前序遍历。

【输入样例】
6
abc
bdi
cj*
d**
i**
j**

【输出样例】
abdicj

【数据范围】
1≤n≤26

【算法分析】
● 字符可以作为数组下标,这本质上是因为"字符类型"可以被隐式或显式地转换为"整数类型"。 在计算机内部,字符是以其对应的整型编码值 (如 ASCII 或 Unicode 码点)来存储和处理的。因此,当你使用一个字符作为数组下标时,编译器会自动将其转换为对应的整数,并用这个整数来索引数组。

● 语句 map<char,char> ls,rs; 在代码中提供了一个灵活、安全的键值存储,用于表示二叉树中每个节点到其左右孩子节点的映射关系。相比固定大小的数组,它避免了因字符 ASCII 码范围不确定而可能导致的数组越界问题(详见:https://blog.csdn.net/hnjzsyjyj/article/details/160991953),是处理此类映射问题的更通用、更安全的方案。

【算法代码】

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

map<char,char> ls,rs;
char root;

void dfs(char rt) {
    if(rt=='*') return;
    cout<<rt;
    dfs(ls[rt]);
    dfs(rs[rt]);
}

int main() {
    int n;
    cin>>n;
    for(int i=1; i<=n; i++) {
        char rt,le,ri;
        cin>>rt>>le>>ri;
        if(i==1) root=rt;
        ls[rt]=le;
        rs[rt]=ri;
    }
    dfs(root);
    return 0;
}

/*
in:
6
abc
bdi
cj*
d**
i**
j**

out:
abdicj
*/

【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/160515496
https://blog.csdn.net/hnjzsyjyj/article/details/160991953

相关推荐
hnjzsyjyj8 小时前
洛谷 P1305:新二叉树 ← DFS
数据结构·dfs
进击的荆棘2 天前
递归、搜索与回溯——综合(上)
c++·算法·leetcode·深度优先·dfs
多喝开水少熬夜6 天前
dfs思路回溯
算法·深度优先·dfs
hnjzsyjyj9 天前
洛谷B3862:图的遍历(简单版)← 邻接表
dfs·邻接表
星马梦缘11 天前
算法设计与分析 作业二 答案与解析
算法·图论·dfs·bfs·floyd-warshall·bellman_ford·多源最短路
westdata-Tm11 天前
洛谷P1219 [USACO1.5] 八皇后 Checker Challenge
算法·深度优先·dfs
hnjzsyjyj13 天前
洛谷 B3622:枚举子集(递归实现指数型枚举)← DFS
数据结构·dfs
hnjzsyjyj15 天前
全排列问题DFS实现执行示意图
数据结构·dfs
XLYcmy15 天前
2026游戏安全技术竞赛-PC客户端安全-初赛 求解起点到终点的最短路径
windows·python·网络安全·dfs·bfs·游戏安全·曼哈顿距离