二叉树链式存储结构
前言
二叉树有两种主流存储方式:顺序存储(数组,适合完全二叉树 / 堆) 、链式存储(链表,普通二叉树首选)。 链式存储是我们写二叉树遍历、BST、AVL、红黑树的基础,不需要占用连续内存,适合形态不规则的二叉树。
一、链式存储相对顺序存储的优势
数组顺序存储二叉树原理:利用完全二叉树下标映射关系 ,根 i,左孩子
2i+1,右孩子2i+2。
- 适配任意形态二叉树,不会浪费大量空间 数组存储只适合完全二叉树。如果是单边斜树(比如只有左孩子),数组要开辟巨大容量,大量位置是空、白白占内存。 链式存储节点按需 malloc,树有多少节点就开辟多少内存,歪斜树、稀疏树都不浪费空间。
- 插入、删除节点代价小 数组存储如果在中间插入节点,需要移动大量元素; 链式只需要修改指针指向,不需要挪动其他节点。
- 节点动态分配,不受预先容量限制 数组需要提前确定最大长度,一旦扩容开销大;链式在堆上动态创建节点,树可以随时长大。
链式短板回顾:不能下标随机访问;每个节点要额外存 2 个指针,有少量额外内存开销。
二、二叉树前、中、后序遍历(递归版,链式结构)
遍历定义:根节点访问顺序区分三种遍历
- 前序遍历:根 → 左子树 → 右子树
- 中序遍历:左子树 → 根 → 右子树
- 后序遍历:左子树 → 右子树 → 根




代码实现前,中,后序遍历
链式存储核心思想
每一个节点是独立的一小块内存。 一个节点包含三部分:
- 数据域:存放当前节点的值
- 左孩子指针:指向左子树节点,没有左孩子则置为
NULL - 右孩子指针:指向右子树节点,没有右孩子则置为
NULL
因为通过指针把一个个节点串联起来,所以叫链式存储。


前序遍历

递归调用
中序遍历和后续遍历于前序不同的时候输出数据的时机是不一样的
