洛谷 P1305:新二叉树 ← DFS

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

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

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

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

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

【输出样例】
abdicj

【数据范围】
1≤n≤26

【算法分析】
● 在 C/C++ 语言中,char 类型本质上是整型的子集,存储的是字符对应的 ASCII 码值。小写字母 a ~ z 的十进制 ASCII 码范围为 97~122。若直接使用小写字符作为数组下标,编译器会自动把字符隐式转换为对应的 ASCII 整数值,再进行数组下标访问。如果数组仅开到 30、50 这类小范围,用 'a'(97)、'b'(98)等字符当下标,会直接造成数组下标越界,触发未定义行为:可能正常运行、可能答案错乱、也可能直接运行报错 RE。因此有两种规范写法:
(1)省事懒人写法:直接将数组大小开到 128(覆盖所有基础 ASCII 字符),无需做字符转换,直接用字母当下标也不会越界,适合二叉树、字符串映射、图论邻接表等场景;
(2)节省空间 + 规范标准写法:若希望把数组下标控制在 30 以内、紧凑利用空间,可将每个小写字母减去字符 'a',把 a~z 映射为连续的 0~25。此时,下标严格可控、完全不会越界,是竞赛和工程中的标准写法。

【算法代码】

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

const int N=30;
char root,ls[N],rs[N];

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

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-'a']=le;
        rs[rt-'a']=ri;
    }
    dfs(root);
    return 0;
}

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

out:
abdicj
*/

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

相关推荐
linux-hzh13 分钟前
百日算法修炼 · Day 17
数据结构·算法
OPEN-F2 小时前
C++入门教程:数组、字符串与指针入门
数据结构·c++·算法
pluviophile_s2 小时前
数据结构:第7讲:图
数据结构·笔记
林森lsjs2 小时前
零基础吃透二叉树:定义、遍历与高频算法 —数据结构柒
java·开发语言·数据结构·算法·二叉树
船厂电气自动化ai大模型2 小时前
AI大模型与数学·第56课 快速傅里叶变换FFT:DFT高效优化算法,图像、音频、扩散模型工程加速核心工具
数据结构·人工智能·深度学习·算法·机器学习
橘子汽水1683 小时前
Leetcode 236,437:二叉树的最近公共祖先,路径总和III
java·数据结构
wabs6664 小时前
关于二叉树【力扣144.二叉树的前序遍历的思考】
数据结构·c++·算法·leetcode·二叉树
LuminousCPP4 小时前
数据结构-二叉树(三):堆复杂度证明与 Top-K 问题|错位相减推导 + 海量数据内存优化
c语言·数据结构·笔记·排序算法
1000世界小札11 小时前
《大话数据结构》第9章精读:归并排序与快速排序完整 C++ 实现
数据结构·c++·算法
一直C1 天前
【数据结构】哈希表+算法复杂度与经典排序查找(C语言)
java·linux·开发语言·数据结构·算法·ubuntu·散列表