1
0
mirror of https://github.com/Didnelpsun/CS408.git synced 2026-06-17 07:27:12 +08:00
This commit is contained in:
Didnelpsun
2022-08-03 22:48:26 +08:00
parent df294ac476
commit b6ba088e9c
3 changed files with 170 additions and 35 deletions

View File

@@ -80,7 +80,7 @@ $C.$后序线索树
$D.$所有线索树
解:$C$。前序遍历(中左右)、中序遍历(左中右)的最后访问的点都是左或右叶点,叶点是没有子树的,所以两个指针域空出来了,可以存放线索指针用于回溯。但是后序遍历(左右中),最后访问的是子树的根点,子树根点的两个指针域都指向子树了,所以不能空出来存放线索信息,只能借助栈存储。
解:$C$。前序遍历(中左右)、中序遍历(左中右)的最后访问的点都是左或右叶点,叶点是没有子树的,所以两个指针域空出来了,可以存放线索指针用于回溯。但是后序遍历(左右中),最后访问的是子树的根点,子树根点的两个指针域都指向子树了,所以不能空出来存放线索信息,只能借助栈存储。
#### 二叉树个数
@@ -108,7 +108,7 @@ $C.$后序遍历
$D.$层次遍历
解:$C$。首先无论是什么遍历方式都会是从左到右的顺序,所以最先找到的一定是左边的结点,最后找到的一定是右边的结点。$m$是$n$的祖先。先序遍历访问次序:左根右,当$n$在左边遍历时会找到$m$到$n$的路径,而当$n$在右边时,由于已经遍历完根点和左子树,则根和左部分的结点没用了就会出栈(使用递归算法时函数数据由栈保存),则$m$就丢掉了,也就不能找到$m$到$n$的路径。同理中序遍历也是会丢掉根和左部分,若$n$在右边则会丢失路径。层次遍历每遍历都会丢掉根点,所以也不能找到。而后序遍历最后遍历根结点,所以根结点会一直保留到子结点全部遍历完才会丢弃,则此时就能找到$n$到$m$的路径。
解:$C$。首先无论是什么遍历方式都会是从左到右的顺序,所以最先找到的一定是左边的结点,最后找到的一定是右边的结点。$m$是$n$的祖先。先序遍历访问次序:左根右,当$n$在左边遍历时会找到$m$到$n$的路径,而当$n$在右边时,由于已经遍历完根点和左子树,则根和左部分的结点没用了就会出栈(使用递归算法时函数数据由栈保存),则$m$就丢掉了,也就不能找到$m$到$n$的路径。同理中序遍历也是会丢掉根和左部分,若$n$在右边则会丢失路径。层次遍历每遍历都会丢掉根点,所以也不能找到。而后序遍历最后遍历根结点,所以根结点会一直保留到子结点全部遍历完才会丢弃,则此时就能找到$n$到$m$的路径。
**例题** 若$X$是二叉中序线索树中一个有左孩子的结点,且$X$不为根,则$X$的前驱为()。
@@ -204,7 +204,25 @@ $D.n+2$
### 平衡二叉树
#### 结点数
**例题** 在任意一棵非空平衡二叉树($AVL$树)$T_1$中,删除某结点$v$之后形成平衡二叉树$T_2$,再将$v$插入$T_2$,形成平衡二叉树$T_2$。下列关于$T_1$与$T_3$的叙述中,正确的是()。
.若$v$是$T$的叶结点,则$T_1$与$T_3$可能不相同
Ⅱ.若$v$不是$T$的叶结点,则$T_1$与$T_3$一定不相同
Ⅲ.若$v$不是$T$的叶结点,则$T_1$与$T_3$一定相同
$A.$仅Ⅰ
$B.$仅Ⅱ
$C.$仅Ⅰ、Ⅱ
$D.$仅Ⅰ、Ⅲ
解:$A$。在非空平衡二叉树中插入结点,在失去平衡调整前,一定插入在叶结点的位置。若删除的是$T_1$的叶结点,则删除后平衡二叉树不会失去平衡,即不会发生调整,再插入此结点得到的二叉平衡树$T_1$与$T_3$相同。若删除后平衡二叉树失去平衡而发生调整,再插入结点得到的二叉平衡树$T_1$与$T_3$可能不同,如一个平衡树的一个子树只有一个结点,删除这个结点则平衡树必然失衡,肯定会重新调整。Ⅰ正确。若$v$不是$T$的叶结点,则删除可能相同也可能不同。一般而言删除一个结点,然后重新加入是从叶子结点处加入,所以肯定不是在原来的根位置。但是如果删除会失衡,则会调整,所以可能会调整回原来的位置。
#### 深度
**例题** 含有$20$个结点的平衡二叉树的最大深度为()。
@@ -234,6 +252,8 @@ $D.3$
### 哈夫曼树
#### 编码字符数
**例题** 设哈夫曼编码的长度不超过$4$,若已对两个字符编码为$1$和$01$,则还最多可对()个字符编码。
$A.2$
@@ -248,6 +268,8 @@ $D.5$
<!-- 若哈夫曼编码的长度只允许小于等于$4$,则哈夫曼树的高度最高是$5$,已知一个字符编码为$1$,另一个字符编码是$01$这说明第二层和第三层各有一个叶子结点为使得该树从第3层起能够对尽可能多的字符编码余下的二叉树应该是满二叉树底层可以有$4$个叶结点,最多可以再对$4$个字符编码。 -->
#### 结点数
**例题** 若度为$m$的哈夫曼树中,叶子结点个数为$n$,则非叶子结点的个数为()。
$A.n-1$
@@ -260,20 +282,54 @@ $D.\lceil n/(m-1)\rceil-1$
解:$C$。一棵度为$m$的哈夫曼树应只有度为$0$和$m$的结点,设度为$m$的结点(叶子结点)有$n_m$个,度为$0$的结点有$n_0$个,又设结点总数为$n$$n=n_0+n_m$。因有$n$个结点的哈夫曼树有$n-1$条分支,则根据总结点与度数关系的公式($n=n_1+2n_2+\cdots+mn_m+1$)得到$mn_m=n-1=n_m+n_0-1$,整理得$(m-1)n_m=n_0-1$$n_m=(n-1)/(m-1)$。
**例题** 在任意一棵非空平衡二叉树($AVL$树)$T_1$中,删除某结点$v$之后形成平衡二叉树$T_2$,再将$v$插入$T_2$,形成平衡二叉树$T_2$。下列关于$T_1$与$T_3$的叙述中,正确的是()。
#### 路径
.若$v$是$T$的叶结点,则$T_1$与$T_3$可能不相同
**例题** 下列选项给出的是从根分别到达两个叶结点路径上的权值序列,属于同一棵哈夫曼树的是()。
Ⅱ.若$v$不是$T$的叶结点,则$T_1$与$T_3$一定不相同
$A.24,10,5$和$24,10,7$
Ⅲ.若$v$不是$T$的叶结点,则$T_1$与$T_3$一定相同
$B.24,10,5$和$24,12,7$
$A.$仅Ⅰ
$C.24,10,10$和$24,14,11$
$B.$仅Ⅱ
$D.24,10,5$和$24,14,6$
$C.$仅Ⅰ、Ⅱ
解:$D$。首先根据两个叶子,以及访问到叶子的前一个结点,这个结点一定是叶子的父亲结点。再根据哈夫曼树的结点一定有兄弟,即不存在度为$1$的结点。因此可以知道兄弟的权值,这样,给定的一个序列就可以推出两个叶子,两个序列推出四个叶子,这样就可以根据是否选择最小的两个叶子结点组合在一起作为判据,决定这个序列是否成立了。
$D.$仅Ⅰ、Ⅲ
对于$D$,第一组最后一个是叶子结点为$5$的权值,中间的是$10$,则另一个叶子结点权值是$10-5=5$。这里不能继续推出。然后看第二组最后一个是叶子结点的权值为$6$,则另一个叶子结点权值为$14-6=8$。所以可以构造哈夫曼树:
解:$A$。在非空平衡二叉树中插入结点,在失去平衡调整前,一定插入在叶结点的位置。若删除的是$T_1$的叶结点,则删除后平衡二叉树不会失去平衡,即不会发生调整,再插入此结点得到的二叉平衡树$T_1$与$T_3$相同。若删除后平衡二叉树失去平衡而发生调整,再插入结点得到的二叉平衡树$T_1$与$T_3$可能不同,如一个平衡树的一个子树只有一个结点,删除这个结点则平衡树必然失衡,肯定会重新调整。Ⅰ正确。若$v$不是$T$的叶结点,则删除可能相同也可能不同。一般而言删除一个结点,然后重新加入是从叶子结点处加入,所以肯定不是在原来的根位置。但是如果删除会失衡,则会调整,所以可能会调整回原来的位置。
```txt
24
|
------
10 14
| |
--- ---
| | | |
5 5 6 8
```
同理分析$A$$24,10,5$和$24,10,7$两组的第二个权值相加为$20\neq24$,权值根本不相等不是哈夫曼树。
同理$B$$24,10,5$和$24,12,7$第二个权值相加也不等于第一个值,所以也不对。
对于$C$$24,10,10$和$24,14,11$数值相加都能对的上,计算两个叶子权值$10-10=0$、$14-11=3$。具体构造出哈夫曼树:
```txt
24
|
-------
10 14
| |
---- ----
| | | |
10 0 11 4
```
看叶子节点的值,最小的是$0$和$4$,他们应该结合在一起,所以构造有问题。
### 并查集
**例题** 假设初始化$0\sim9$的并查集,按照$1-2$、$3-4$、$5-6$、$7-8$、8-9$、$1-8$、$0-5$、$1-9$的顺序进行查找和合并,求最后集合数量。
解:初始化时$0\sim9$一共十个集合。$1-2$时合并$\{1,2\}$。$3-4$时合并$\{3,4\}$、$5-6$时合并$\{5,6\}$、$7-8$时合并$\{7,8\}$、$8-9$时合并$\{7,8,9\}$、$1-8$时合并$\{1,2,7,8,9\}$、$0-5$时合并$\{0,5,6\}$、$1-9$时属于同一集合不用合并。最后为$\{0,5,6\}$、$\{1,2,7,8,9\}$、$\{3,4\}$,所以有三个。

File diff suppressed because one or more lines are too long

View File

@@ -18,8 +18,8 @@
+ 有向图:若$E$是有向边(也称弧)的有限集合时,则图$G$为有向图。弧是顶点的有序对,记为$<v,w>$,其中$v$、$w$是顶点,$v$称为弧尾,$w$称为弧头,$<v,w>$称为从顶点$v$到顶点$w$的弧,也称$v$邻接到$w$,或$w$邻接自$v$。$<v,w>\neq<w,v>$。
+ 简单图:不存在重复边,且不存在顶点到自身的边。一般的图默认是简单图。
+ 多重图:图$G$中某两个结点之间的边数多于一条,又允许顶点通过同一条边与自己关联。
+ 无向完全图:对于无向图$\vert E\vert\in[0,n(n-1)/2]$,无向图中任意两个顶点之间都存在边。
+ 有向完全图:对于有向图$\vert E\vert\in[0,n(n-1)]$,有向图中任意两个顶点之间都存在方向相反的两条弧。
+ 无向完全图:对于无向图$\vert E\vert\in[0,n(n-1)/2]$,无向图中任意两个顶点之间都存在边,即$\vert E\vert=n(n-1)/2$
+ 有向完全图:对于有向图$\vert E\vert\in[0,n(n-1)]$,有向图中任意两个顶点之间都存在方向相反的两条弧,即$\vert E\vert=n(n-1)$
+ 稀疏图:一般$\vert E\vert<\vert V\vert\log\vert V\vert$的图。
+ 稠密图:一般$\vert E\vert>\vert V\vert\log\vert V\vert$的图。
+ 树:不存在回路,且连通的无向图。
@@ -27,11 +27,13 @@
### 顶点的度
对于无向图,顶点$v$的度是指依附于该顶点的边的条数,记为$TD(v)$。$\sum\limits_{i=1}^nTD(v_i)=2\vert E\vert$。
对于无向图,顶点$v$的度是指依附于该顶点的边的条数,记为$TD(v)$。
对于具有$n$个顶点,$e$条边的无向图,$\sum\limits_{i=1}^nTD(v_i)=2e$,即无向图的全部顶点的度的和等于边数的两倍。
对于具有$n$个顶点,$e$条边的无向图,$\sum\limits_{i=1}^nTD(v_i)=2\vert E\vert=2e$,即无向图的全部顶点的度的和等于边数的两倍。因为每条边都与两个顶点关联。
对于有向图,入度是指以顶点$v$为终点的有向边的条数,记为$ID(v)$;出度指以顶点$v$为起点的有向边的条数,记为$OD(v)$;顶点$v$的度就是其入度和出度之和,即$TD(v)=ID(v)+OD(v)$。$\sum\limits_{i=1}^nID(v_i)=\sum\limits_{i=1}^nOD(v_i)=\vert E\vert$。因为每条有向边都有一个起点和点。
对于有向图,入度是指以顶点$v$为终点的有向边的条数,记为$ID(v)$;出度指以顶点$v$为起点的有向边的条数,记为$OD(v)$;顶点$v$的度就是其入度和出度之和,即$TD(v)=ID(v)+OD(v)$。$\sum\limits_{i=1}^nID(v_i)=\sum\limits_{i=1}^nOD(v_i)=\vert E\vert$。因为每条有向边都有一个起点和点。
有向树:一个顶点的入度为$0$,其他顶点入度均为$1$的有向图。
### 顶点的关系
@@ -47,20 +49,20 @@
### 图的连通
+ 连通:在无向图中,若从顶点$v$到顶点$u$有路径存在,则称$uv$是连通的。
+ 强连通:在有向图中,若从顶点$v$到顶点$u$和从顶点$u$到顶点$v$之间都有路径,则称强连通。
+ 连通图:无向图中任意两个顶点之间都是连通的。对于$n$个顶点的无向图,若其是连通图,则最少需要$n-1$条边,若其是非连通图,则最多有$C_{n-1}^2$条边。
+ 强连通图:有向图中任意两个顶点之间都是强连通的。对于$n$个顶点的有相同,若其是强连通图,则最少需要$n$条边来形成环路。
+ 强连通:在有向图中,若从顶点$v$到顶点$u$和从顶点$u$到顶点$v$之间都有路径,则称$uv$是强连通。
+ 连通图:无向图中任意两个顶点之间都是连通的。对于$n$个顶点的无向图,若其是连通图,则最少需要$n-1$条边,若其是非连通图,则最多有$C_{n-1}^2$条边$n-1$个顶点构成一个完全图)
+ 强连通图:有向图中任意两个顶点之间都是强连通的。对于$n$个顶点的有向图,若其是强连通图,则最少需要$n$条边来形成环路。
+ 子图:设有两个图$G=(V,E)$和$G'=(V',E')$,若$V'$是$V$的子集,$E'$是$E$的子集,则$G'$是$G$的子图。
+ 生成子图:若有满足$V(G')=V(G)$的子图$G'$,则$G'$是$G$的生成子图。
+ 生成子图:若有满足$V(G')=V(G)$的子图$G'$,则$G'$是$G$的生成子图。(即子图包含所有顶点,但不一定包含所有的边)
+ 连通分量:无向图$G$中的极大连通子图称为$G$的连通分量;对任何连通图而言,连通分量就是其自身。
+ 强连通分量:有向图$G$中的极大连通子图称为$G$的强连通分量;对任何强连通图而言,强连通分量就是其自身。
+ 极大连通子图:是图的连捅分量,要求连通子图包含其所有的边。
+ 极小连通子图:要保持图连通也要让边数最小的子图。
+ 生成树:包含连通图中全部顶点的一个极小连通子图。若图的顶点为$n$,则其生成树包含$n-1$条边,若去掉生成树的一条边则会变成非连通图,若加上一条边则会形成一个回路。
+ 生成森林:在非连通图中,连通分量的生成树构成了非连通图的生成森林。
无向图研究连通性,有向图研究强连通性。
区分极大连通子图和极小连通子图。极大连通子图是无向图的连通分量,极大即要求该连通子图包含其所有的边;极小连通子图是既要保持图连通又要使得边数最少的子图。
### 图的权
+ 边的权:在一个图中,每条边都可以表上具有某种含义的数值,这就是该边的权值。