当前位置:首页 > 数据结构复习题及参考答案
c d Head a b c d e ^ 7.该算法是求链表结点个数的算法。 结果返回结点个数的总和值。
8.本算法要求二叉树中叶子结点的总数的算法。
用n值存储叶子结点的个数。
9.(15,30,48,50)
10.从初始点vi出发深度优先搜索遍历由邻接距阵GA所表示的图
11.该算法是顺序栈类的出栈算法。 如果栈空返回-999;否则返回出栈元素的值。 12.该算法是将链表逆置的算法。 链表逆置后,具体如下图:
Head e d c b a ^ 13.输出是“ 查找成功,找到:5 ” 比较3次得到结果。
14.向单链表的末尾添加一个元素。 15.删除线性表中所有重复的元素。 16.23 25 35 45 77 78
17. 1 2 3 4 5 6 7 8 9 10 五、算法设计题:
1.将算法实现函数声明为二叉树类的友元函数,可采用层次遍历的方式进行复制,将已复制的结点进入一个队列中即可。 具体算法实现如下:
// 文件路径名:exam5\\alg.h template
void CopyBitree(BinaryTree
第17页共22页
} }
fromQ.InQueue(fromPtr->leftChild); toQ.InQueue(toPtr->leftChild); // 入队 } if (fromPtr->rightChild != NULL) { // 右子树非空 toPtr->rightChild = new BinTreeNode
toBtPtr = new BinaryTree
2.从上图来看,二叉树的第一层显示在第一列,第二层显示在第二列,第三层显示在第三列;每行显示
一个结点,从上至下是先显示右子树,再显示根,最后最左子树,也就是以先遍历右子树,最后遍历左子树的中序遍历次序显示各结点。 具体算法实现如下:
// 文件路径名:exam1\\alg.h ss ElemType>
void DisplayHelp(BinTreeNode
// 操作结果:按树状形式显示以r为根的二叉树,level为层次数,可设根结点的层次数为1 { if(r != NULL) { // 空树不显式,只显式非空树 DisplayHelp
template
void Display(const BinaryTree
3.对于排列的解空间可构造一个虚拟的解空间树,比如n=5,k=3时的解空间树如下图所示,可采用对此树进行先序遍历方式进行遍历,并用递归法进行递归输出从n个数中挑选 k个进行排列所得序列。
具体算法实现如下:
// 文件路径名:exam7\\alg.h template
第18页共22页
void Arrage(ElemType a[],int k,int n, int outlen=0)
// 操作结果: 回溯法输出排列序列,a[0..k-1]为k个数的排列序列outlen为当前所求排列 // 序列的长度,其中outlen=k时的排列序列为所求;n为list数组长度 { if (k < 0 || k >= n) return; // 此时无排列 int i; // 临时变量 if (outlen == k + 1) { // 得到一个排列 for (i = 0; i < k; i++) { // 输出一个排列 cout << a[i]; // 输出a[i] } cout << \ // 用空格分隔不同排列 } else { // 对解空间进行前序遍历,a[outlen..n]有多个排列,递归的生成排列 for (i = outlen; i < n; i++) { // 处理a[i] Swap(a[outlen+1], a[i]); // 交换a[outlen+1]与a[i] Arrage(a, k, n, outlen + 1); // 对序列长度outlen+1递归 Swap(a[outlen+1], a[i]); // 交换a[outlen+1]与a[i] } } }
4.编写一个算法,交换单链表中p所指向的结点和其后续结点的两个结点,Head指向该链表的表头,P指向链表中的某一结点。 Head c e ^ a d b
void Link ::swap( NodeType *p) //0.5分
{ NodeType *q,*r,*s;
q=p->next; //0.5分 if(q!=NULL) //1分 { if(p==Head) //4分 {Head=Head->next; s=Head->next; Head->next=p; p->next=s; }
Else // 4分 { r=Head;
while(r->next!=p) r=r->next; r->next=q;
p->next=q->next; q->next=p; } } }
5.可按先遍历右子树,遍历根结点,再遍历左子树进行中序遍历,这样可实现由大到小遍历一棵二叉排序树。
具体算法实现如下:
// 文件路径名:exam4\\alg.h
第19页共22页
#include \ // 二叉排序树类 template
void InOrderHelp(BinTreeNode
// 操作结果: 从大到小输出以r为根的二叉排序树中所有的关键字值不小于key的元素值 { if (r != NULL) { // 非空二叉排序树 InOrderHelp(r->leftChild, key); // 遍历左子树 if(r->data < key) cout << r->data << \ // 输出根结点 else return; InOrderHelp(r->rightChild, key); // 遍历右子树 } }
template
void InOrder(const BinarySortTree
6. void Link ::Delnode( )
{ NodeType *p=Head->next, *q,*r=p;
while(p!=NULL&&p->data p=p->next; } q=p; while( q!=NULL && p->data p=r;r=r->next; } delete q; } // delpro 7.二叉树采取顺序结构存储,是按完全二叉树格式存储的。对非完全二叉树要补上“虚结点”。由于不是完全二叉树,在顺序结构存储中对叶子结点的判定是根据其左右子女为0。叶子和双亲结点下标间的关系满足完全二叉树的性质。 int Leaves(int h) //求深度为h以顺序结构存储的二叉树的叶子结点数 hh {int BT[]; int len=2-1, count=0; //BT是二叉树结点值一维数组,容量为2 for (i=1;i<=len;i++) //数组元素从下标1开始存放 if (BT[i]!=0) //假定二叉树结点值是整数,“虚结点”用0填充 if(i*2)>len) count++; //第i个结点没子女,肯定是叶子 else if(BT[2*i]==0 && 2*i+1<=len && BT[2*i+1]==0) count++; //无左右子女的结点是叶子 return (count) 第20页共22页
共分享92篇相关文档