-
二叉树的建立:将二叉树的每个结点的空指针引出一个虚结点,其值为一个特殊值,如”#”,我们称这种处理后的二叉树为原二叉树的拓展二叉树.
-
线索二叉树:指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树就称为线索二叉树(Threaded Binary Tree).
-
对二叉树以某种次序遍历使其变为线索二叉树的过程称作是线索化.
-
线索二叉树的实现
-
线索化的实质就使将二叉链表中的空指针改为指向前驱或后继的线索,由于前驱和后继的信息只有在遍历该二叉树时才能得到,所以线索化的过程就是在遍历的过程中修改空指针的过程.
-
中序遍历线索化的递归函数:
-
如果所有的二叉树需经常遍历或查找结点时需要某种遍历序列中的前驱和后继,那么采用线索二叉链表的存储结构就是非常不错的选择.
-
树转换为二叉树:
a. 加线:在所有兄弟结点之间加一条线;
b. 去线:对树中每个结点,只保留它与第一个孩子结点的连线,删除它与其他孩子结点之间的连线.
c. 层次调整:以树的根节点为轴心,将整棵树顺时针旋转一定的角度,使之结构层次分明.注意第一个孩子是二叉树结点的左孩子,兄弟转换过来的孩子是结点的右孩子.
9. 森林转换为二叉树:
a. 把每棵树都转换为二叉树;
b. 第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根节点作为前一棵二叉树的根结点的右孩子,用线连接起来,当所有的二叉树连接起来后就得到了由森林转换来的二叉树.
10. 二叉树转换为树:是树转换为二叉树的逆过程.
a. 加线,若某节点的左孩子结点存在,则将这个左孩子的有孩子结点,右孩子的右孩子结点,右孩子的右孩子的右孩子结点…….用线连接起来.
b. 去线:删除原二叉树中所有结点与其右孩子结点的连线.
c. 层次调整:使之结构层次分明.
11. 二叉树转换为森林:
判断一棵二叉树是转换为树还是森林的标准就使看该二叉树的根节点是否有右孩子,如果有就使森林,没有就使一棵树.
a. 从根节点开始,若右孩子存在,则把与右孩子结点的连线删除,再查看分离后的二叉树,若右孩子存在,则连线删除……,直到所有右孩子连线都删除为止,得到分离的二叉树.
b. 再将每棵分离后的二叉树转换为树即可.
12. 树与森林的遍历:
a. 树的遍历分为两种方式:
i. 先根遍历,即先访问树的根节点,然后依次先根遍历根的每棵子树.
iii. 后根遍历,即先依次后根遍历每棵子树,然后再访问根节点.b. 森林的遍历也分为两种方式:
ii. 前序遍历:先访问森林中第一棵树的根节点,然后再依次先根遍历根的每棵子树,再依次用同样方式遍历出去第一颗树的剩余树构成的森林.
iii. 后序遍历:是先访问森林中第一颗树,后根遍历的方式遍历每棵子树,然后再访问根节点,再依次同样方式遍历出去第一颗树的剩余树构成的森林.
- 赫夫曼树
a. 路径长度:从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称作路径长度.
b. 树的路径长度:就使从树根到每一个结点的路径长度之和.
c. 结点的带权路径长度:从该节点到树根之间的路径长度与几点上权的乘积.
d. 赫夫曼树:假设有n个权值{w1,w2,w3,……,wn},构造一棵有n个叶子结点的二叉树,每个叶子结点带权Wk,每个叶子的路径长度为lk,带权路径长度WPL最小的二叉树称作赫夫曼树,也称最优二叉树.
- 构造赫夫曼树的算法:
a. 根据给定的n个权值{w1,w2,w3,……wn}构成n棵二叉树的集合F={T1,T2,T3,…Tn},其中每棵二叉树Ti中只有一个带权为Wi根节点,其左右子树均为空.
b. 在F中选取两棵根节点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根节点的权值为其左右子树上根节点的权值之和.
c. 在F中删除这两棵树,同时将新得到的二叉树加入F中.
d. 重复2和3步骤,直到F只含一棵树为止,这棵树便是赫夫曼树.
- 若要设计长短不等的编码,则必须是任一字符的编码都不是另一个字符的编码的前缀,这种编码称作前缀编码.
- 一般地,设需要编码的字符集为{d1,d2,d3,…dn},各个字符在电文中出现的次数或频率集合为{W1,W2,W3,…Wn},以d1,d2,……dn作为叶子结点,以W1,W2,W3,…Wn作为相应叶子结点的权值来构造一棵赫夫曼树.规定赫夫曼树的做分支代表0,右分支代表1,则从根节点到叶子节点所经过的路径分支组成0和1的序列便为该节点对应字符编码,这就是赫夫曼编码.
- 图(Graph):是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中G表示一个图,V是图G中顶点的集合,E是图G中边的集合.
a. 图中数据元素称之为顶点(Vertex);
b. 图强调了顶点结合V的有穷非空;
c. 图中任意两个顶点之间都有可能有关系,顶点之间的逻辑关系用边来表示,边集可以为空.
- 图的相关定义:
a. 边的分类
i. 无向边:若顶点Vi到Vj之间的边没有方向,则称这条边为无向边(Edge),用无序偶对(Vi,Vj)来表示,顶点次序可以互换;
ii. 有向边: 若顶点Vi到Vj之间的边有方向,则称这条边为有向边,也称为弧(Arc)用无序偶对<Vi,Vj>来表示.连接顶点A到D的有向边就使弧,A是弧尾,D是弧头,<A,D>表示弧.b. 图分类
i. 无向图:如果图中任意两个顶点之间的边都是无向边,则称该图为无向图(Undirected graphs).
ii. 有向图: 如果图中任意两个顶点之间的边都是有向边,则称该图是有向图(Directed graphs).iii. 简单图:在图中,若不存在顶点到其自身的边,且同一条边不重复出现,则称这样的图为简单图.
iv. 无向完全图:在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图.含有n个顶点的无向完全图含有n*(n-1)/2条边.
v. 有向完全图:在有向图中,如果任意两个顶点之间都存在方向互为相反的两条弧.含有n个顶点的有向完全图有n*(n-1)条边.
vi. 稀疏图:有很少条边或弧的图称为稀疏图.反之称为稠密图.
vii. 网(Network):图的边或弧相关的数叫做权(Weight),这种带有权的图通常称为网.权可以为为顶点到顶点的距离或耗费.c. 子图(Subgraph):假设有两个图G=(v,{E})和G’=(V’,{E’}),如果V’ ⊆V且E’ ⊆E,则成G’为G的子图.
d. 图的顶点与边间关系:i. 顶点V的度(Degree):对于无向图G=(V,{E}),如果边(V,V’) ϵE,则称顶点V和V’互为邻接点(Adjacent),即V和V’相邻接.边(V,V’)依附(incident)于顶点V和V’,或者说(V,V’)与顶点V和V’相关联.顶点的度就使和V相关联的边的数目,记为TD(v).
ii. 对于有向图G=(V,{E}),如果弧<V,V’> ϵE,则称顶点v邻接到顶点v’,顶点v’邻接自顶点v.弧<V,V’>和顶点V,V’相关联.以顶点V为头的弧的数目称为V的入度(InDegree),记为ID(V);以v为尾的弧的数目称为v的初读(OutDegree),记为OD(V);顶点V的度为TD(V)=ID(V)+OD(V);
iii. 对于无向图G=(V,{E})中从顶点v到顶点v’的路径(Path)是一个顶点序列(v=vi,0,vi,1,……,vi,m),其中(vi,j-1,vi,j) ϵ E,1≤ j ≤m.
iv. 如果G是有向图,则路径也是有向的,顶点序列应满足< vi,j-1,vi,j >ϵ E,1≤ j ≤m.
v. 路径的长度是路径上的边或弧的数目.
vi. 第一个顶点到最后一个顶点相同的路径称为回路或环(Cycle).序列中顶点不重复出现的路径称为简单路径.除了第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路,称为简单回路或简单环.如下图:前者是简单环,后者不是
e. 连通图相关术语i. 在无向图G中,如果顶点v到v’有路径,则成v和v’是连通的.如果对于图中任意两个顶点vi,vj ϵ,vi和vj都是连通的,则称G是连通图(Connected Graph).
ii. 无向图中的极大连通子图称为连通分量.连通分量:
- 要是子图;
- 子图要是连通的;
- 连通子图含有极大顶点数;
- 具有极大顶点数的连通子图包含依附于这些顶点的所有边.
iii. 在有向图G中,如果对于每一对vi,vj ϵV,vi≠vj,从vi到vj和从vj到vi都存在路径,则称G是强连通图.有向图中的极强连通子图称作有向图的强连通分量.
iv. 一个连通图的生成树是一个极小的连通子图,它含有图中全部的n个顶点,但只有足以构成一棵树的n-1条边.
v. 如果一个有向图恰有一个顶点的入度为0,其余顶点的入度为1,则是一棵有向树.
vi. 一个有向图的生成森林由若干棵有向树组成,含有图中全部顶点,但只有足以构成若干棵不想叫的有向树的弧.
- 图的抽象数据类型: