树的度
描述:树的节点包含一个数据元素以及指向其子树的分支。
- 结点的度:结点拥有的子树数称为结点的度。
- 度为0,称为叶结点或终端结点;
- 度不为0,称为非终端结点或分支结点;
- 树的度:树内各结点的度的最大值;
树的层次
从根开始,根为第一层,根的孩子为第二层,依此类推。
树的深度或高度:树中结点的最大层次;
有序树
树中各结点的子树看成从左到右有次序,不能互换的,称为有序树,否则称为无序树
树的存储结构
- 双亲表示法(顺序存储)
- (1)每个结点元素包含数据域以及双亲指针域。如果需要找到该结点的双亲结点,只需要通过O(1)的时间,如果要知道结点的孩子是什么,需要遍历整个结构
- (2)在(1)的基础上,做调整。指针域加多一个字段,指向结点的第一个孩子(最左边孩子,也称为长子域)
- (3)…
- 孩子表示法(链式存储)
多重链表法:每个结点有多个指针域,每个指针指向一颗子树的根节点- 每个结点指针域的个数等于树的度,导致空间浪费
- 每个结点指针域的个数等于结点的度,维护运算难度加大
孩子表示法:所有结点存进一个一维数组中,孩子结点以单链表作存储。其中一维数组结点包括数据域以及一个指针域,指针域指向最左孩子结点。单链表中的孩子结点,包括两个指针域,其中一个指针域指向一维数组下标,另一指针指向下一个兄弟。
双亲孩子表示法
- 孩子兄弟表示法
- 第一版:使用链表,每个结点包括三部分,数据域以及两个指针域,其中两个指针域分别指向该结点第一个孩子以及右兄弟,该版缺陷在于找双亲
- 第二版:每个结点添加多一个指针域,指向其双亲
二叉树
- 二叉树特点:
- 结点最多有两棵子树
- 左子树和右子树有顺序
- 即使结点只有一棵子树也要区分是左子树还是右子树
- 二叉树基本形态:
- 空二叉树
- 只有一个根节点
- 根节点只有左子树
- 根节点只有右子树
- 根节点既有左子树又有右子树
- 特殊二叉树:
- 斜树
- 每层只有一个结点
- 结点的个数与二叉树的深度相同
- 满二叉树
- 所有分支结点都存在左右子树
- 所有叶子结点都在同一层
- 完全二叉树
概念:对一颗具有n个结点的二叉树按层编号,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中的位置完全相同,则这棵二叉树称为完全二叉树 - 二叉搜索树
- 左子树上的数据域均小于或等于根节点
- 右子树上的数据域均大于或等于根节点
- 平衡二叉树(avl树)
- 左子树与右子树的高度差的绝对值不超过1
- 斜树
二叉树性质
- 在二叉树的第i层上至多有2^(i-1)个结点(i>=1)
- 深度为k的二叉树至多有2^k-1
- 终端结点数为n0,度为2的结点数为n2,则n0=n2+1
- 具有n个结点的完全二叉树深度为(log2n往下取整)+1
- 对一棵n个结点的完全二叉树编号,对任一结点i有
- 如果i=1,则结点i是二叉树的根,无双亲;i>1,双亲是(i/2向下取整)
- 如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子是2i
- 如果2i+1>n,则结点i无右孩子;否则右孩子是结点2i+1
二叉树存储结构
- 顺序存储,只适用于完全二叉树。其他树使用顺序存储会造成存储空间的浪费
- 二叉链表,每个结点有一个数据域以及两个指针域,两个指针域分别指向左右子树(如有需要可加多一个指针域指向其双亲,称为三叉链表)
遍历二叉树
- 前序遍历,根左右
- 中序遍历,左根右
- 后序遍历,左右根
- 层序遍历,从左到右逐层访问
基于二叉树的延伸
节点的阶:一个节点的子节点数目的最大值,用m表示
B树,B+树