二叉树基础笔记

게시일: 2025-12-16 00:00 수정일: 2025-12-16 00:00 701자 4 min read

이 게시물은 아직 한국어 번역이 없으므로 원문으로 표시돼요
二叉树的顺序存储、链式存储、线索二叉树详解

本文整理二叉树的存储方式和线索二叉树的核心知识点。

1. 二叉树的存储

1.1 顺序存储

顺序存储使用数组存放完全二叉树,通过下标表示结点关系。

顺序存储
顺序存储

编号规则(从 1 开始):

结点公式
左孩子2i
右孩子2i + 1
父亲⌊i/2⌋

特点:适合完全二叉树,空间利用率高;非完全二叉树会浪费空间。

1.2 链式存储(二叉链表)

链式存储使用指针连接结点,每个结点包含:

  • data:数据域
  • lchild:左孩子指针
  • rchild:右孩子指针
链式存储
链式存储

重要规律:空指针个数 = 结点数 + 1

1.3 三叉链表

在二叉链表基础上增加 parent 指针,方便向上查找。

三叉链表
三叉链表
类型指针特点
二叉链表lchild, rchild只能向下查找
三叉链表lchild, rchild, parent可双向查找

2. 链式存储代码实现

2.1 C++ 写法

struct BTNode {
    char data;
    BTNode *lchild;
    BTNode *rchild;
};
C++写法
C++写法

2.2 C 语言写法(typedef)

使用 typedef 给结构体起别名,简化声明:

typedef struct BTNode {
    char data;
    struct BTNode *lchild, *rchild;
} BTNode;

// 使用时不需要加 struct 前缀
BTNode a, *d;
BTNode *b = (BTNode*)malloc(sizeof(BTNode));
C写法
C写法
typedef详解
typedef详解

3. 线索二叉树

3.1 为什么需要线索化

二叉链表中存在大量空指针(结点数+1 个),造成浪费。

线索化:利用空指针存储前驱/后继信息,提高遍历效率。

线索化原理
线索化原理

3.2 线索化规则

空指针指向
左空指针前驱结点
右空指针后继结点

3.3 线索标志位

如何区分指针指向的是孩子还是线索?增加 ltagrtag 标志位:

线索标志
线索标志
标志位含义
ltag/rtag0指向左/右孩子
ltag/rtag1指向前驱/后继(线索)

结点结构

typedef struct BTNode {
    char data;
    struct BTNode *lchild, *rchild;
    int ltag, rtag;  // 线索标志
} BTNode;

3.4 中序线索二叉树示例

中序线索二叉树
中序线索二叉树

对二叉树进行中序线索化后:

  • 中序序列:B → D → A → C
  • 空指针被利用为前驱/后继线索

4. 总结

存储方式优点缺点
顺序存储访问简单,适合完全二叉树非完全树浪费空间
二叉链表灵活,节省空间空指针浪费
三叉链表可双向查找多一个指针开销
线索二叉树利用空指针,遍历高效结构复杂

关键点

  • 空指针个数 = 结点数 + 1
  • 线索化利用空指针存储前驱/后继
  • ltag/rtag 用于区分孩子和线索

마음에 드신다면, 댓글을 남겨주세요~