二叉树定义
二叉树(英语:Binary tree)是每个节点最多只有两个分支(即不存在分支度大于2的节点)的树结构。通常分支被称作“左子树”或“右子树”。二叉树的分支具有左右次序,不能随意颠倒。
二叉树是递归定义的,其节点有左右子树之分,逻辑上二叉树有五种基本形态:
(1)空二叉树——如图a;
(2)只有一个根节点的二叉树——如图b;
(3)只有左子树——如图c;
(4)只有右子树——如图d;
(5)完全二叉树——如图e。
二叉树性质
- 在非空二叉树中,二叉树的第i层至多拥有2i-1个节点;
- 深度为k的二叉树最多有2k-1个节点(定义根节点所在深度 k0),而总计拥有节点数符合的,称为满二叉树;最少有k个节点;
- 对任何一棵非空的二叉树T,如果其叶片(终端节点)数为n0,分支度为2的节点数为n2,则n0=n2+1。
- 深度为k有n个节点的二叉树,当且仅当其中的每一节点,都可以和同样深度k的满二叉树,序号为1到n的节点一对一对应时,称为完全二叉树。
- 具有n个节点的完全二叉树的深度为 ⌊ log 2 n ⌋ + 1 \lfloor\log_2n\rfloor+1 ⌊log2n⌋+1
- 给定n个节点,能构成h(n)种不同的二叉树。
h(n)为卡特兰数的第n项。 h ( n ) = C 2 n n n + 1 h(n)=\frac{C_{2n}^n}{n+1} h(n)=n+1C2nn
特殊的二叉树
满二叉树(full binary tree)
如果每个内部节点(非叶节点)都包含两个孩子,就成为满二叉树。
完美二叉树(perfect binary tree)
当所有的叶子节点都在同一层就是完美二叉树,毫无间隙填充了 k 层。
完全二叉树(complete binary tree)
当一个高度为 k 的完美二叉树减少到 k-1,并且最底层的槽被毫无间隙地从左到右填充,称为完全二叉树。
存储结构
顺序存储表示
二叉树可以用数组或链接串列来存储,若是满二叉树就能紧凑排列而不浪费空间。
如果某个节点的索引为i,(假设根节点的索引为0)则在它左子节点的索引会是2i+1,以及右子节点会是2i+2。
而它的父节点(如果有)索引则为
⌊
i
−
1
2
⌋
\left\lfloor {\frac {i-1}{2}}\right\rfloor
⌊2i−1⌋
优点:
有利于紧凑存储和更好的访问的局部性,特别是在前序遍历中。
缺点:
它需要连续的存储空间,这样在存储高度为h的n个节点所组成的一般树时,将浪费很多空间。在最糟糕的情况下,如果深度为h的二叉树其每个节点都只有右孩子,则该存储结构需要占用2h-1的空间,实际上却有h个节点,浪费了不少空间。
二叉链表存储表示
二叉树通常用树节点结构来存储。有时也包含指向唯一的父节点的指针。如果一个节点的子节点个数小于2,一些子节点指针可能为空值,或者为特殊的哨兵节点。 使用链表能避免顺序存储浪费空间的问题,算法和结构相对简单,但使用二叉链表,由于缺乏父链的指引,在找回父节点时需要重新扫描树得知父节点的节点地址。
三叉链表存储表示
改进于二叉链表,增加父节点的指引,能更好地实现节点间的访问,不过算法相对复杂。 当二叉树用三叉链表表示时,有N个节点,就会有N+2个空指针。