二叉树一共有两种主流存储方式:顺序存储、链式存储
一、顺序存储结构(数组存储)
- 存储规则
按照完全二叉树层序编号,从上到下、从左到右依次存入数组下标。
规定:数组下标从 1 开始
-
编号 `i` 结点
-
左孩子:`2i`
-
右孩子:`2i+1`
-
父结点:`i/2`
空结点用特殊值(0/∅)占位。
- 适用场景
只适合完全二叉树、满二叉树
-
空间利用率极高,没有浪费
-
查找父子结点极快,公式直接算
- 缺点
普通二叉树(歪树)会大量浪费数组空间
最坏单支树,n 个结点却需要 2ⁿ 空间,极度低效。
二、链式存储结构
- 结点结构
每个结点包含三部分:
-
数据域 data:存放结点值
-
左孩子指针 lchild:指向左子树根
-
右孩子指针 rchild**:指向右子树根
Java 结点代码:
java
class TreeNode{
int data;
TreeNode left;
TreeNode right;
}
- 特点
-
任意二叉树都适用,不浪费空间
-
找孩子方便,找父结点麻烦(需要遍历)
-
根结点指针唯一标识整棵二叉树
- 附加:三叉链表
在二叉链表基础上增加父指针 parent
-
优点:找父结点、找祖先都很快
-
缺点:多占用存储空间
三、两种存储对比
- 顺序存储
-
优点:查找父子关系方便、随机访问快
-
缺点:浪费空间、只适合完全二叉树
-
结构:数组
- 二叉链表存储
-
优点:灵活、任意二叉树通用、无空间浪费
-
缺点:无法直接找双亲,只能遍历
-
结构:指针链表
四、结论
-
n 个结点的二叉链表,空指针域个数 = n + 1
-
顺序存储严格依赖完全二叉树编号性质
-
二叉树遍历、算法实现,全部默认用二叉链表