【数据结构与算法】新二叉树

👨‍💻 关于作者:会编程的土豆

"不是因为看见希望才坚持,而是坚持了才看见希望。"

你好,我是会编程的土豆,一名热爱后端技术的Java学习者。

📚 正在更新中的专栏:

💕作者简介:后端学习者

1.

cpp 复制代码
#include <iostream>
#include <cstring>
using namespace std;

struct Node {
    char left, right;
} tree[130];  // 用ASCII码作为索引

string preorder;

void preOrder(char root) {
    if (root == '*') return;  // 空节点
    
    preorder += root;  // 访问根节点
    preOrder(tree[root].left);   // 遍历左子树
    preOrder(tree[root].right);  // 遍历右子树
}

int main() {
    int n;
    cin >> n;
    
    char root;  // 记录根节点
    bool isFirst = true;
    
    for (int i = 0; i < n; i++) {
        string s;
        cin >> s;
        char node = s[0];
        
        if (isFirst) {
            root = node;  // 第一行的节点是根节点
            isFirst = false;
        }
        
        tree[node].left = s[1];
        tree[node].right = s[2];
    }
    
    preOrder(root);
    cout << preorder << endl;
    
    return 0;
}

从输入构建二叉树并输出前序遍历:一篇彻底讲清楚(数组建树法)

这类题在数据结构中非常经典:

给你一组节点信息(父节点 + 左右孩子),让你构建二叉树并进行遍历

你这段代码已经是竞赛级标准写法,但很多人写完其实并不理解"为什么这样就能建树"。

这篇文章就帮你把这个过程彻底讲透。


一、题目本质

输入类似:

复制代码
3
ABC
B*D
C**

含义是:

复制代码
A 的左孩子是 B,右孩子是 C
B 的左孩子是 *(空),右孩子是 D
C 没有孩子

二、核心思想

一句话总结:

复制代码
用数组模拟"指针",用字符直接当下标建树

三、数据结构设计

复制代码
struct Node {
    char left, right;
} tree[130];

为什么用 130?

复制代码
ASCII 字符范围足够(A~Z)

关键理解

复制代码
tree['A'] 就表示 A 这个节点

例如:

复制代码
tree['A'].left = 'B';
tree['A'].right = 'C';

就等价于:

复制代码
A
├── B
└── C

四、建树过程(重点)

复制代码
for (int i = 0; i < n; i++) {
    string s;
    cin >> s;
    char node = s[0];

    tree[node].left = s[1];
    tree[node].right = s[2];
}

输入解析

例如:

复制代码
ABC

表示:

复制代码
A.left = B
A.right = C

特殊符号

复制代码
* 表示空节点

五、根节点怎么确定?

复制代码
if (isFirst) {
    root = node;
}

为什么第一行是根?

因为题目保证输入顺序:

复制代码
第一行就是整棵树的根

(这是这类题的默认规则)


六、前序遍历函数(核心)

复制代码
void preOrder(char root) {
    if (root == '*') return;
    
    preorder += root;
    preOrder(tree[root].left);
    preOrder(tree[root].right);
}

逻辑解释

复制代码
前序遍历 = 根 → 左 → 右

执行顺序:

复制代码
1. 访问当前节点
2. 递归左子树
3. 递归右子树

七、执行流程示例

输入:

复制代码
3
ABC
B*D
C**

构建树

复制代码
      A
     / \
    B   C
     \
      D

遍历过程

复制代码
访问 A
→ 访问 B
→ 访问 D
→ 返回
→ 访问 C

输出结果

复制代码
ABDC

八、为什么不用指针也能建树?

很多人卡在这里。


本质原因

复制代码
字符本身就是"节点编号"

所以:

复制代码
tree['A'] → 就是 A 节点

不需要:

复制代码
new TreeNode

对比指针写法

方法 特点
指针建树 面向对象
数组建树 竞赛更快

九、时间复杂度

复制代码
建树:O(n)
遍历:O(n)
总:O(n)

十、空间复杂度

复制代码
O(n)

十一、常见错误


1. 忘记判断 '*'

复制代码
if (root == '*') return;

2. 根节点写错

不是随便选的,是:

复制代码
第一行输入

3. 数组越界

复制代码
tree[130] 是安全范围

十二、扩展:三种遍历对比

遍历方式 顺序
前序 根 → 左 → 右
中序 左 → 根 → 右
后序 左 → 右 → 根

改成中序

复制代码
preOrder(tree[root].left);
preorder += root;
preOrder(tree[root].right);

改成后序

复制代码
preOrder(tree[root].left);
preOrder(tree[root].right);
preorder += root;

十三、一句话总结

复制代码
数组建树 = 用字符当下标 + 直接记录左右孩子 + 递归遍历
相关推荐
智者知已应修善业11 小时前
【51单片机89C51及74LS273、74LS244组成】2022-5-28
c++·经验分享·笔记·算法·51单片机
洛水水12 小时前
【力扣100题】33.验证二叉搜索树
算法·leetcode·职场和发展
SimpleLearingAI12 小时前
聚类算法详解
算法·数据挖掘·聚类
刀法如飞13 小时前
Go 字符串查找的 20 种实现方式,用不同思路解决问题
算法·面试·程序员
Dlrb121114 小时前
C语言-指针数组与数组指针
c语言·数据结构·算法·指针·数组指针·指针数组·二级指针
WL_Aurora14 小时前
Python 算法基础篇之集合
python·算法
平行侠15 小时前
A15 工业路由器IP前缀高速检索与内存压缩系统
网络·tcp/ip·算法
阿旭超级学得完16 小时前
C++11包装器(function和bind)
java·开发语言·c++·算法·哈希算法·散列表
li星野16 小时前
位运算 & 数学 & 高频进阶九题通关(Python + C++)
c++·python·学习·算法
jerryinwuhan16 小时前
hello算法,简单讲(1)
算法·排序算法