二叉树基础:概念、存储结构与遍历算法详解
一、二叉树的概念
1.1 二叉树的定义
二叉树是一种特殊的树型结构,其特点是每个结点至多只有 2 棵子树(即二叉树中不存在度大于 2 的结点),并且二叉树的子树有左右之分,其次序不能任意颠倒。简单来说,二叉树的每一个结点最多有两个孩子结点,也可能没有孩子或者只有一个孩子。
注意:二叉树结点的两个孩子,一个被称为左孩子,一个被称为右孩子。其顺序是固定的,就像人的左手和右手,不能颠倒混淆。
1.2 特殊的二叉树
1.2.1 满二叉树
一棵二叉树的所有非叶子节点都存在左右孩子并且所有叶子节点都在同一层上,那么这棵树就称为满二叉树。

1.2.2 完全二叉树
对一棵树有 n 个结点的二叉树按层序编号,所有的结点的编号从 1~n。如果这棵树所有结点和同样深度的满二叉树的编号为从 1∼n 的结点位置相同,这棵二叉树为完全二叉树。实际上就是在满二叉树的基础上,在最后一层的叶子结点上,从右往左依次删除若干个结点,剩下的就是一棵完全二叉树。

二、二叉树的存储
在之前已经学过树的存储,二叉树也是树,也是可以用 vector 数组或者链式前向星来存储。仅需在存储的过程中标记谁是左孩子,谁是右孩子即可。 • 比如用 vector 数组存储时,可以先尾插左孩子,再尾插右孩子; • 用链式前向星存储时,可以先头插左孩子,再头插右孩子。只不过这样存储下来,遍历孩子的时候先遇到的是右孩子,这点需要注意。
2.1 顺序存储
在完全二叉树以及满二叉树的性质那里,我们了解到:如果从根节点出发,按照层序遍历的顺序,由开始编号,那么父子之间的编号是可以计算出来的。那么在存储完全二叉树的时候,就按照编号,依次放在数组对应下标的位置上,然后通过计算找到左右孩子和父亲:设节点下标为 i。


如果不是完全二叉树,也是可以用顺序存储。但是首先要先把这棵二叉树补成完全二叉树,然后再去编号。不然就无法通过计算找到左右孩子和父亲的编号。

辨析:可以看到我们的二叉树其实只有 6 个节点,但是顺序存储却要分配 10 个空间,其中有 4 个空间都被浪费掉了。如下图我们考虑一种极端的情况,一棵树右斜树,它只有 4 个节点,但是需要分配 2^4 - 1 个存储单元,这显然会对存储空间造成很大的浪费。所以,顺序存储结构一般只用于完全二叉树或满二叉树。










