{p=Q[front++]; temp++; //同层元素数加1
if (p->lchild!=null) Q[++rear]=p->lchild; //左子女入队 if (p->rchild!=null) Q[++rear]=p->rchild; //右子女入队 if (front>last) //一层结束,
{last=rear;
if(temp>maxw) maxw=temp;
//last指向下层最右元素, 更新当前最大宽度
temp=0;
}//if }//while
return (maxw); }//结束width
(6)用按层次顺序遍历二叉树的方法,统计树中具有度为1的结点数目。 [题目分析]
若某个结点左子树空右子树非空或者右子树空左子树非空,则该结点为度为1的结点 [算法描述]
int Level(BiTree bt) //层次遍历二叉树,并统计度为1的结点的个数 {int num=0; //num统计度为1的结点的个数
if(bt){QueueInit(Q); QueueIn(Q,bt);//Q是以二叉树结点指针为元素的队列
while(!QueueEmpty(Q))
{p=QueueOut(Q); cout<
if(p->lchild && !p->rchild ||!p->lchild && p->rchild)num++; //度为1的结点
if(p->lchild) QueueIn(Q,p->lchild); //非空左子女入队 if(p->rchild) QueueIn(Q,p->rchild); //非空右子女入队 } // while(!QueueEmpty(Q)) }//if(bt) return(num);
}//返回度为1的结点的个数
(7)求任意二叉树中第一条最长的路径长度,并输出此路径上各结点的值。
[题目分析]因为后序遍历栈中保留当前结点的祖先的信息,用一变量保存栈的最高栈顶指针,每当退栈时,栈顶指针高于保存最高栈顶指针的值时,则将该栈倒入辅助栈中,辅助栈始终保存最长路径长度上的结点,直至后序遍历完毕,则辅助栈中内容即为所求。
[算法描述]
void LongestPath(BiTree bt)//求二叉树中的第一条最长路径长度 {BiTree p=bt,l[],s[];
XLI
//l, s是栈,元素是二叉树结点指针,l中保留当前最长路径中的结点 int i,top=0,tag[],longest=0; while(p || top>0)
{while(p) {s[++top]=p;tag[top]=0; p=p->Lc;} //沿左分枝向下 if(tag[top]==1) //当前结点的右分枝已遍历
{if(!s[top]->Lc && !s[top]->Rc) //只有到叶子结点时,才查看路径长度 if(top>longest)
{for(i=1;i<=top;i++) l[i]=s[i]; longest=top; top--;} //保留当前最长路径到l栈,记住最高栈顶指针,退栈 }
else if(top>0) {tag[top]=1; p=s[top].Rc;} //沿右子分枝向下 }//while(p!=null||top>0) }//结束LongestPath
(8)输出二叉树中从每个叶子结点到根结点的路径。
[题目分析]采用先序遍历的递归方法,当找到叶子结点*b时,由于*b叶子结点尚未添加到path中,因此在输出路径时还需输出b->data值。
[算法描述]
void AllPath(BTNode *b,ElemType path[],int pathlen) {int i; if (b!=NULL)
{if (b->lchild==NULL && b->rchild==NULL) //*b为叶子结点 {cout << \到根结点路径:\ for (i=pathlen-1;i>=0;i--) cout << endl;
} else
{path[pathlen]=b->data; //将当前结点放入路径中 pathlen++; //路径长度增1 AllPath(b->lchild,path,pathlen); //递归扫描左子树 AllPath(b->rchild,path,pathlen); //递归扫描右子树 pathlen--; //恢复环境 }
}// if (b!=NULL) }//算法结束
XLII
第6章 图
1.选择题
(1)在一个图中,所有顶点的度数之和等于图的边数的( )倍。 A.1/2 B.1 C.2 D.4 答案:C
(2)在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的( )倍。 A.1/2 B.1 C.2 D.4 答案:B
解释:有向图所有顶点入度之和等于所有顶点出度之和。 (3)具有n个顶点的有向图最多有( )条边。
A.n B.n(n-1) C.n(n+1) D.n2 答案:B
解释:有向图的边有方向之分,即为从n个顶点中选取2个顶点有序排列,结果为n(n-1)。 (4)n个顶点的连通图用邻接距阵表示时,该距阵至少有( )个非零元素。 A.n B.2(n-1) C.n/2 D.n2 答案:B
(5)G是一个非连通无向图,共有28条边,则该图至少有( )个顶点。 A.7 B.8 C.9 D.10 答案:C
解释:8个顶点的无向图最多有8*7/2=28条边,再添加一个点即构成非连通无向图,故
至少有9个顶点。
(6)若从无向图的任意一个顶点出发进行一次深度优先搜索可以访问图中所有的顶点,则该图一定是( )图。
A.非连通 B.连通 C.强连通 D.有向 答案:B
解释:即从该无向图任意一个顶点出发有到各个顶点的路径,所以该无向图是连通图。 (7)下面( )算法适合构造一个稠密图G的最小生成树。
A. Prim算法 B.Kruskal算法 C.Floyd算法 D.Dijkstra算法 答案:A
解释:Prim算法适合构造一个稠密图G的最小生成树,Kruskal算法适合构造一个稀疏
图G的最小生成树。
(8)用邻接表表示图进行广度优先遍历时,通常借助( )来实现算法。 A.栈 B. 队列 C. 树 D.图 答案:B
解释:广度优先遍历通常借助队列来实现算法,深度优先遍历通常借助栈来实现算法。
XLIII
(9)用邻接表表示图进行深度优先遍历时,通常借助( )来实现算法。 A.栈 B. 队列 C. 树 D.图 答案:A
解释:广度优先遍历通常借助队列来实现算法,深度优先遍历通常借助栈来实现算法。 (10)深度优先遍历类似于二叉树的( )。
A.先序遍历 B.中序遍历 C.后序遍历 D.层次遍历 答案:A
(11)广度优先遍历类似于二叉树的( )。
A.先序遍历 B.中序遍历 C.后序遍历 D.层次遍历 答案:D
(12)图的BFS生成树的树高比DFS生成树的树高( )。
A.小 B.相等 C.小或相等 D.大或相等 答案:C
解释:对于一些特殊的图,比如只有一个顶点的图,其BFS生成树的树高和DFS生
成树的树高相等。一般的图,根据图的BFS生成树和DFS树的算法思想,BFS生成树的树高比DFS生成树的树高小。
(13)已知图的邻接矩阵如图6.30所示,则从顶点v0出发按深度优先遍历的结果是( )。
图6.30 邻接矩阵
(14)已知图的邻接表如图6.31所示,则从顶点v0出发按广度优先遍历的结果是( ),按深度优先遍历的结果是( )。
图6.31 邻接表
A.0 1 3 2 答案:D、D
B.0 2 3 1 C.0 3 2 1 D.0 1 2 3
XLIV