树型结构
元素之间存在一对多关系的数据结构,适合存储具有层次关系的数据模型,如:文件树、组织关系、族谱。
树的相关术语
根结点:树的最顶层结点,一棵树最多只有一个根结点。
双亲结点、父结点:结点的上一层结点,一个结点只有唯一一个双亲结点。
子结点:结点的下层结点,可以有若干个。
叶子节点:没有子结点的结点。
树的高度:树的层数
树的密度:树的结点数量
树的种类
(重要)二叉树:一个结点最多有两个孩子。
普通树:只有一个双亲结点,子结点的数量任意。
B树:多路平衡查找树,
多路:最多有M个子结点
平衡:所有子树的高度相差不超过1
查找:所有结点是有序的
B树和B+树了解即可,普通树一般成二叉树研究。
二叉树的种类
满二叉树
除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树,每层的结点数量是:2 ^ (n-1),总结点数是:2 ^ n-1。
完全二叉树
除了最后一层外的所有层的结点数是:2 ^ (n-1)。
最后一层的结点按照从左到右的顺序排列。
有序二叉树
左子结点比双亲结点小,右子结点比双亲结点大,所有结点都遵循该规则。
线索二叉树
给普通二叉树结点,增加上线索,使用它能够以循环的方式遍历,提高遍历速度。
哈夫曼树
带权重的二叉树。
平衡二叉树
左右子树高度相差不超过1。
红黑树
接近平衡的二叉树,伪平衡二叉树。
堆
大根堆
双亲结点比左右子结点都大。
小根堆
双亲结点比左右子结点都小。
二叉树的链式存储
每个结点(元素)由三部分组成:
值
左子树指针
右子树指针
优点:能很清晰的表示树的结构,对内存的要求低,节约内存。
缺点:只能逐级访问,递归遍历,可能产生内存碎片。
二叉树的顺序存储
注意:需要把普通二叉树补全为完全二叉树。
[] [#][] [#][#][][] [][][][][][][]
没有的地方用#号代替
前提:节点的下标从1开始排列
i/2 = 父节点下标
i2 = 左子节点下标
i2+1 = 右子节点下标
优点:创建树方便,计算高度、密度速度快,使用的整块内存不易产生内存碎片。
缺点:对内存的要求高,当树比较稀疏时,对内存浪费极高,转换成完全二叉树时麻烦。
有序二叉树
左右子树与根结点的关系必须满足:左 < 根 <= 右
二叉树的遍历
A
/ \
B C
/ / \
D E F
/ \ \
G H J
/
I
ABCD#EFGH###J####I
前序:根 左 右
第一个元素为根结点
A B D G H I C E J F
A B D G # # H I # # # # C E # J # # F # #
后序:左 右 根
最后一元素为根结点
G I H D B J E F C A
中序:左 根 右
根结点左边的都是左子树,根结点右边的都是右子树。
G D I H B A E J C F
注意:所有子树都要遵循规则,要把每个结点当作一棵子树看待。
1、根据二叉树写出前、中、后遍历顺序。
2、根据 前序+中序 中序+后序 还原二叉树
G D I H B A E J C F 中
G I H D B J E F C A 后
1、根据后序确定根结点
2、根中序和根确定左右子树的数量
3、然后根据左右子树的数量确定,左右子树的后序
4、再使用同样的方法构建左右子树
G D I H B E J C F
G I H D B J E F C