二叉树基础笔记

Published 2025-12-16 00:00 Updated 2025-12-16 00:00 701 words 4 min read ... Page views Handwritten Every word here was typed by me.

This post is not yet available in English. Showing the original.
二叉树的顺序存储、链式存储、线索二叉树详解

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

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 线索标志位

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

线索标志
线索标志
标志位值含义
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 用于区分孩子和线索

Written by Handwritten

If you enjoyed this, leave a comment~

... Page views
© 2025 - 2026 youki
Powered by theme astro-koharu · Inspired by Shoka
Loading...