其压缩思路同对称矩阵。
LOC[aij]=LOC(a11)+(k-1)*L
矩阵压缩的原因:
在数值分析中经常出现一些阶数很高的矩阵,同时在矩阵中有许多值相同的元素或者是0元素。
有时为了节省存储空间,可以对这类矩阵进行压缩储存。
1.二叉树顺序存储后逻辑关系通过什么表示?
答:
顺序存储结构:
按照顺序存储结构的定义,在此约定,用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素,即将完全二叉树上的编号为i的结点元素存储在如上定义的一维数组中下标为i-1的分量中。
2.何时用树结构?
树是否只能用链式存储?
解:
表示具有分支和层次关系的数据时用树。
二叉树等特殊情况可用顺序存储。
3.已知二叉树的深度k,则其结点数范围?
已知二叉树的结点数,则其深度k范围?
4.只有3个结点的二叉排序树有几种形态?
解:
有5种,见下图所示。
5.完全二叉树有6个叶子,则结点总数就是11吗?
解:
已知叶子数的完全二叉树一般有两棵,结点数差1,见下图:
一般,结点数n=n0+n1+n2,而n0=n2+1(二叉树性质),所以n=2n0-1+n1。
完全二叉树树中度为1的结点最多只有1个,即n1=1或0,所以n=2n0或n=2n0-1。
6.某完全二叉树有600个结点,则叶子数有多少?
度1结点有多少?
解:
由层次编号规律,结点i的左孩子编号为2i,若结点i为叶子,则它没有左孩子,即2i>n,即i>n/2=300的结点为叶子,叶子号为301,302,…,600,共300个。
由于n0=n2+1,现在n0=300,所以n2=299。
另外,结点总数n=n0+n1+n2,所以n1=600-300-299=1
7.最优二叉树的构造过程?
WPL计算?
8.最优二叉树可否有100个结点?
若有111个结点,则其中有多少个叶子?
有没有度为1的结点?
解:
结点总数n=2n0-1,n0为叶子数,可见结点数为奇数。
对111个结点,n0=(n+1)/2=56。
根据构造过程,每次两个结点合并,故结点的度要么为2(分支结点),要么为0(叶子),不会出现度1的结点。
9.二叉树的顺序存储结构、二叉链表的画法?
二叉链表中有多少个空指针?
10.如何由先序+中序、后序+中序还原出二叉树?
解:
由遍历方法以下几点是显然的:
①对前序序列,序列的第一个点就是整个二叉树的根;
②对后序序列,序列的最后一个点就是整个二叉树的根;
③对中序序列,以根为界,序列的前一部分结点在根的左子树中,后一部分结点在根的右子树中;并且,由前一部分构成的子序列是左子树的中序序列,由后一部分构成的子序列是右子树的中序序列。
若给定了前序和中序序列,反复利用上面的①和③,就可获得结点完整的逻辑信息,即由前序序列找到根,由中序序列得到左、右子树;再在对每个子树由前序序列找到子树的根,由中序序列得到子树的左、右子树,等等类推,每次都可得到一个点(子树的根),从而逐渐获得树的全部信息,也就可以还原和构造出该二叉树。
这个过程参见下图。
例:
已知二叉树的中序和后序序列分别为:
BCDAFEHJIG、DCBFJIHGEA,画出该二叉树。
解:
由后序序列可知,整个二叉树的根为A,再从中序序列找到结点A,其左边为BCD,对应A的左子树,右边为FEHJIG,对应根的右子树。
对每个子树进行同样分析即可画出此二叉树。
比如对左子树BCD,从原后序序列可找到它对应的后根序列为DCB,于是左子树的根为B,然后再由中序序列BCD可知B的左子树为空,CD在B的右子树,等等继续下去,直到每个结点都画出来。
10.树、森林与二叉树的相互转换?
如何判断二叉树是树还是森林转换而来?
树/森林的遍历与对应二叉树的遍历之间有何关系?
答:
森林与二叉树的转换:
1.保留所有结点与其左结点的链接
2.连接所有兄弟结点(拥有同一父结点的子结点)
3.打断所有结点原本与右子结点的链接
4.将兄弟结点顺时针转45度。
图为。
。
。
树和森林的遍历:
树结构定义可以引出两种次序遍历树的方法,先根次序和后根次序,而森林的两种方法分别是先序和后序,树和森林的具体遍历方法与二叉树的三种遍历方法类似。
11.树的孩子链表、双亲链表、孩子兄弟链表的画法?
13.例:
求二叉树的结点数。
解:
设二叉树结点类型为bitree,函数名为sum,函数返回结点数。
intsum(bitreet){
intL,R;
if(t==NULL)return0;//当前树为空,递归出口
L=sum(t->lchild);//求左子树中结点数
R=sum(t->rchild)//求右子树中结点数
returnL+R+1;//结点数=左子树中结点数+右子树中结点数+1
}
14.例:
求二叉树的叶子结点数。
解:
设二叉树结点类型为bitree,函数名为leaf,函数返回叶子数。
intleaf(bitreet){
intL,R;
if(t==NULL)return0;//当前树为空,递归出口
if(t->lchild==NULL&&t->rchild==NULL)return1;//当前点为叶子,递归出口
L=leaf(t->lchild);//求左子树中叶子数
R=leaf(t->rchild)//求右子树中叶子数
returnL+R;//叶子数=左子树中叶子数+右子树中叶子数
}
15.例:
求二叉树的高度。
解:
设二叉树结点类型为bitree,函数名为high,函数返回高度。
inthigh(bitreet){
intL,R;
if(t==NULL)return0;//当前树为空,递归出口
L=high(t->lchild);//求左子树高度
R=high(t->rchild)//求右子树高度
return(L>R?
L:
R)+1;//高度=左、右子树高度较大者+1
}
1.图的边数范围?
连通图的边数范围?
顶点度数之和与边数有何关系?
答:
无向图中最多有
条边,若为有向图,最多有n(n-1)条边。
连通图最少有n-1条边。
若一个图中有n个顶点和e条边,则图中所有顶点的度同边数e满足:
2.图的两种常用储存方式邻接表、邻接矩阵。
2.有向图、无向图邻接表、邻接矩阵的画法?
特点?
在邻接表、邻接矩阵上求出度和入度?
答:
邻接矩阵:
是表示顶点之间相邻关系的矩阵。
在采用邻接矩阵表示图,对于无向图,边数即为矩阵中非0(或非max)的个数除以2,对于有向图,边数即为矩阵中非0(或非max)的个数;对于无向图,顶点vi的度就是对应第i行或第i列上非0(或非max)元素的个数,对于有向图,顶点vi的出度就是对应第i行上非0(或非max)元素的个数,顶点vi的入度就是对应第i列上非0(或非max)元素的个数。
邻接表:
是对图中的顶点建立一个邻接关系的单链表,并把它们的表头指针用向量存储的一种图的表示方法。
在图的邻接表中便于查找一个顶点的度(出度),这只要首先从表头向量中取出对应的表头指针,然后从表头指针出发进行查找计算即可。
但对于有向图的邻接表中查找一个顶点的入度,那就不方便了,它需要扫描所有的顶点邻接表中所有顶点邻接表中的边结点,因此专门建立一个逆邻接表,该表中的每个顶点的单链表示储存该顶点的所有入边的信息。
3.如何由输入的边信息画邻接表?
如何在邻接表上进行DFS、BFS遍历?
答:
画邻接表:
(1)fori:
=1tondo
Begin
Read(GL[i].data);{读入顶点vi的信息}
GL[i].link:
=nil;{表头指针域置空}
End;
(2)fork:
=1toedo
begin
Read(i,j);{读入一条边的两端点序号}
New(s);s^.adjvex:
=j;
{为vi邻接表生成一个出边邻接顶点}
s^.next:
=GL[i].link;GL[i].link:
=s;{把结点s^插入到vi邻接表的表头}
end;
DFS:
Proceduredfs(i);
Begin
(1)write(i);
(2)visited[i]:
=true;{置vi结点已访问}
(3)p:
=GL[i].link;{取vi邻接表的表头指针}
(4)whilep<>nildo{依次搜索vi的邻接点}
begin
j:
=p^.adjvex;{j为vi的一个临界点的符号}
ifnotvisited[j]then
dfs(j);{如果vi的一个邻接点vj没有被访问,则从vj出发调用}
p:
=p^.next;{使用p指向vi的下一格邻接点所对应的边结点}
end
end;
BFS:
Procedurebfs(i);{从出发点vi出发广度优先搜索用邻接表GL表示的图}
Begin
Setnull(Q);{置队列空}
Write(i);{访问处始点vi}
Visited[i]:
=true;{置vi已访问}
Insert(Q,i);
Repeat
(1)k:
=delete(Q);{队首元素出队,第一次执行时是把i赋给k}
(2)p:
=GL[k].link;{取vk邻接表的表头指针}
(3)whilep<>nildo{依次搜索vk的邻接点}
begin
j:
=p^.adjvex;{vj为vk的一个邻接表}
ifnotvisitedthen
write(j);{访问点vj}
visited[j]:
=true;
insert(Q,j);
p:
=p^.next{使p指向下一个邻接点对应的边结点}
untilempty(Q)
end;
5.DFS的实现用到栈,BFS的实现用到队列。
5.DFS类似树的先根遍历,BFS类似树的层次遍历。
6.有向图顶点出度之和=结点入度之和?
答:
顶点出度之和=结点入度之和
7.连通分量含义?
连通图有多少连通分量?
答:
在无向图G中,若从顶点vi到顶点vj有路径,则称vi和vj是连通的。
若图中的任意两个顶点都连通,则称G为连通图,否则称为非连通图。
无向图G的极大连通子图称为G的连通分量。
显然,任何连通图的连通分量只有一个,即本身。
8.生成树、最小生成树的概念?
如何求?
唯一否?
生成树:
一个连通无向图的生成树是图的一个连通分量,它含有图的所有n个顶点以及连接这些顶点的n-1条边。
不唯一。
最小生成树:
具有权最小的生成树称为图的最小生成树。
不唯一。
Prim算法和Kruskal算法。
11.什么图可得到生成树,什么图可得到生成森林?
解:
连通图得到生成树,非连通图得到生成森林。
12.如何拓扑排序?
有向图是否总可拓扑排序?
唯一否?
-无回路的有向图可以拓扑排序,不一定唯一
13.例:
在邻接矩阵M[n][n]上求顶点k的入度。
解:
入度=矩阵相应列中1的个数。
intin(intM[n][n],intn,intk){
inti,j=0;
for(i=0;ireturnj;
}
1.为什么要进行排序?
-方便以后的查找
2.排序可分为插入排序、选择排序、交换排序、_____、_____。
3.当初始序列基本有序时,哪些排序方法较快?
哪些排序方法反而变慢?
4.哪些排序方法的效率与序列的初始状态基本无关?
有关?
5.哪些排序方法稳定、不稳定?
排序法
平均时间复杂度
最坏时间复杂度
稳定度
空间复杂度(辅助存储)
效率与序列的初始状态
冒泡排序法
O(n2)
O(n2)
稳定
O
(1)
基本有关
快速排序
O(nlog2n)
O(n2)
不稳定
O(log2n)
选择排序
O(n2)
O(n2)
稳定
O
(1)
基本有关
堆排序
O(n×log2n)
O(n×log2n)
不稳定
O
(1)
插入排序
O(n2)
O(n2)
稳定
O
(1)
基本有关
谢尔排序
O(n1.3)
O
不稳定
O
(1)
二叉排序树
O(n×log2n)
O(n2)
不一定
O(n)
归并排序
O(n×log2n)
O(n×log2n)
稳定
O(n)
基数排序
O(d(n+rd))
O(d(n+rd))
稳定
O(n+rd)
6.关键字比较次数越少,排序就越快吗?
快速排序在任何时候都最快吗?
解:
除了关键字比较,还有关键字移动问题。
如果移动次数多、结点内容又多,则排序时间也会较长。
特别地,基数排序不需比较,但执行时间并不一定比需要比较的排序快。
6.各种排序方法步骤如何?
要会写每趟的结果。
难点:
快速排序、堆排序、希尔排序。
1.二分查找、顺序查找、分块查找对数据表有何要求?
分块查找由哪2步组成?
答:
需要数据项有序,分块查找:
先确定待查记录所在的块,可以用顺序查找也可以用折半查找;然后再块中顺序查找。
2.顺序查找的监视哨是否一定设在0号位置?
不一定
3.何为二叉排序树?
中序特点?
其形态与什么有关?
答:
二叉排序树(binarysorttree)或者是一棵树,或者是具有下列性质的二叉树:
(1)若它的左子树不为空,则左子树上所有结点的值均小于它根结点的值;
(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)他的左、右子树也分别是二叉排序树。