1、数据结构算法设计题复习题算法设计题1. 设二叉树 bt 采用二叉链表结构存储。试设计一个算法输出二叉树中所有非叶子结点,并求出非叶子结点的 个数。【答案】int count=0;void algo2(BTNode *bt)if (bt)if(bt-lchild | bt-rchild)printf(bt-data);count+ ;algo2(bt-lchild); algo2(bt-rchild);BSTNode,*BSTree;设计递归算法,统计一棵二叉排序树 T中值小于a的结点个数。 答案】int f34(BSTree root)int count;BSTNode *p;p=root;i
2、f ( p & p-datalchild);return count;5.注:结点按从设二叉树T采用二叉链表结构存储,试设计算法求出二叉树中离根最近的第一个叶子结点。 上往下,自左 至右次序编号)【答案】BTNode * Firstleaf(BTNode *bt), 编写算 InitQueue(Q); 已知一棵具有n个结点的完全二叉树被顺序存储在一维数组中,结点为字符类型法打印出编号为k的结点的双亲和孩子结点。【答案】int algo2(char bt,int n,int k)7.编写算法,将非空单链表 hb插入到单链表ha的第i(Onext; p=p-next);for(j=1,q=ha;j
3、next;p-next=q-next;q-next=hb-next ;free(hb);8.设二叉树T已按完全二叉树的形式存储在顺序表 T中,试设计算法根据顺序表 T建立该二叉树的二叉链表结构。顺序表T定义如下:struct treeint no;/*ElEMTPdata; /*结点按完全二叉树的编号 */ 数据域 */为二叉树T的结点数*/TN;【答案】BTNode *creat_tree( BTNode *pMAX;t=NULL;for(i=0;idata=Ti.data;s-lchild=s-rchild=NULL;m=Ti.no; pm=s;if(m=1) t=s;else j=m/2
4、;if(m%2=0) pj-lchild=s;else pj-rchild=s; 编写算法判断带表头结点的单链表 L 是否是递增的。若递增返回 1,否则返回 0。【答案】int algo1 (LNode *L )if(!L-next) return 1;p=L-next;while(p-next)if(p-data next-data) p=p-next;else return 0;return 1;10.假设一线性表由Fibonacci数列的前n (n 3)项构成,试以带表头结点的单链表作该线性表的存储结构, 设计算法建立该单链表,且将项数 n存储在表头结点中。Fib on acci数列根据
5、下式求得:1 (n=1)f(n)= 1 (n=2)f(n-2)+f(n-1) (n 【答案】 LNode * Creatlist(LNode *h,int n) h=(LNode *)malloc(sizeof(Lnode); h-data=n;/* Nstruct tree TN )h-next=p=(LNode *)malloc(sizeof(Lnode); p-next=q=(LNode *)malloc(sizeof(Lnode);p-data= q-data=1;for(i=3;inext=s=(LNode *)malloc(sizeof(Lnode);s-data=p-data+q
6、-data; s-next=NULL;p=q;q=s;return h;11.设二叉树T采用二叉链表结构存储,数据元素为字符类型。设计算法将二叉链表中所有的结点改为大写data 域为小写字母字母。【答案】void algo2(BTNode *bt)if (bt)if(bt-data=a& bt - datadata-=32;algo2(bt-lchild);algo2(bt-rchild);12. 假设线性表以带表头结点的循环单链表表示。试设计一个算法,在线性表的第 如表长小于 k ,则插在表尾。【答案】k个元素前插入新元素y。假void Insertlist(LNode *h,int k,E
7、lemType y)q=h; P=h-next; j=1;while( p!=h & jnext; j+;s=(LNode *)malloc(sizeof(Lnode);s-data=y;q-next=s;s-next=q;13. 有一带表头结点的单链表,其结点的元素值以非递减有序排列,编写一个算法在该链表中插入一个元素 使得插入后的单链表仍有序。【答案】x,void algo1 (LNode *H, ElemTp x)s=(LNode *) malloc ( sizeof (LNode);s-data=x;q=H; p=H-next;while ( p & p-datanext;s-next
8、=p; q-next=s;14. 二叉排序树的类型定义如下:typedef struct BSTNode / 二叉排序树的结点结构/左、右孩子指针struct BSTNode *lchild, *rchild;BSTNode,*BSTree;设计递归算法,统计一棵二叉排序树 T中值小于a的结点个数。 答案】int f34(BSTree root)int count;BSTNode *p;p=root;if ( p & p-datalchild);return count;15. 有一带表头结点的单链表,其结点的 data 域的类型为字符型,编写一个算法删除该链表中的数字字符。 【答案】void
9、 Del_digit (LNode *h)for(p=h;p-next;)q=p-next;if(q- data= 0 & q - data next=q-next; free(q); else p=q;16. 利用栈的基本运算,编写一个算法,实现将整数转换成二进制数输出。 【答案】void returnDtoO(int num)initStack(s); while(n) k=n%2; n=n/2;push(s,k);while(EmptyStack(s) pop(s,k);p rintf( “ %d” ,k);17.设二叉树T采用二叉链表结构存储,数据元素为 int型,试设计一个算法,若结
10、点左孩子的 data域的值大于右孩子的 data 域的值,则交换其左、右子树。【答案】void algo2(bitreptr bt)bitreptr x;if (bt)if (bt-lchild & bt-rchild) & (bt-lchild -data bt-rchild-data) ) x= bt-lchild ;bt-lchild= bt-rchild;bt-rchild=x;algo2(bt-lchild);algo2(bt-rchild);18.设二叉树T采用二叉链表结构存储,试设计算法求出二叉树的深度。【答案】int Deep(BTNode *bt)if (bt=NULL) r
11、eturn 0;left=Deep(bt-lchild);right=Deep(bt-rchild);return (leftrightleft:right)+1;19.设给定的哈希表存储空间为 H(0M-1),哈希函数的构造方法为“除留余数法”,处理冲突的方法为“线性探测法”,设计算法将元素 e填入到哈希表中。【答案】void hash-insert(hashTable h,int m,ElemType e)j=e%p;if(hj!=NULL) hj=e;elsedo j=(j+1) %m;while(hj!=NULL );hj=e;20.【答案】对于给定的十进制正整数 , 打印出对应的八进
12、制正整数。 (利用栈)void DecToOct(int num) initStack(s);一个正读和反读都相同的字符序列称为“回文”。例如“ abcba”和“ 1221 ”是回文,而为结束符的字符序列是否是回文。“abcde”不是回文。试写一个算法,要求利用栈的基本运算识别一个以【答案】 int Pair(char *str ) InitStack(s) ; p=str for ( ; *p!= ; p+ )Push(s,*p); while(StackEmpty(s) Pop(s,y); if(y!=*str+ ) return 0;return 1;22.)。有一带表头结点勺单链表,其
13、结点勺元素值以非递减有序排列,编写一个算法删除该链表中多余勺元素值 相同勺结点 ( 值相同勺结点只保留一个【答案】void Delsame (LNode *h)if(h-next) for(p=h-next;p-next;) q=p-next; if(p-data=q-data) p-next=q-next; free(q);else p=q;23.单链表是否递增有序。编写一个算法,判断带表头结点勺【答案】 int fun(LNode *h ) p=h-next;while(p-next) q=p-next ; if(q-datap-data) return 0;p=q;return 1;24
14、.HA和HB设计算法将单链表 HBt入到单链表HA勺第i(Onext; p=p-next); for(j=1,q=ha;jnext; ;p-next=q-next;q-next= hb-next free(hb);25.假设以带头结点的单链表表示有序表,单链表的类型定义如下:typedef struct nodeDataType data;struct node *nextLinkNode, *LinkList;编写算法,从有序表 A中删除所有和有序表B中元素相同的结点。【答案】(空)26.data 域为英文字设二叉树T采用二叉链表结构存储,数据元素为字符类型。设计算法分别求出二叉链表中 母和
15、数字字符的 结点个数。【答案】int letter=0 , digit=0 ;/* 全局变量 */void algo2(BTNode *bt)if (bt)algo2(bt-lchild); 27.algo2(bt-rchild);假设以单链表表示线性表 , 单链表的类型定义如下 : typedef struct node DataType data;struct node *next; LinkNode, *LinkList;head的单向循环链编写算法,将一个头指针为head且不带头结点的单链表改造为一个含头结点且头指针仍为 表,并分析算法的时间复杂度。【答案】 LinkList f34(
16、LinkList head)LinkList p,s;p=head;while (p-next) p=p-next; s=(LinkList)malloc(sizeof(LinkNode); s-next=head;p-next=s;head=s; return head; 时间复杂度为 :O(n)28.Vi到顶点Vj是否存在弧。假设有向图以邻接表方式存储,编写一个算法判别顶点 【答案】 int IsArcs(ALgraph G,int i,int j) /*判断有向图G中顶点i到顶点j是否有弧,是则返回1,否则返回0*/ p=Gi.firstarc; while (p!=NULL) if(p
17、-adjVex =j) return 1;p=p-nextarc;return 0;29.data 域为大写字母的设二叉树T采用二叉链表结构存储,数据元素为字符类型。设计算法求出二叉链表中 结点个数。【答案】int count=0 ;/* count 为全局变量 */Void algo2(BTNode *bt)if (bt)if(bt- data=A& bt -datalchild);algo2(bt-rchild);30.假设带表头结点的双向循环链表定义如下: typedef struct dunode char data; struct dunode *prior, *next;xyzzy
18、x ”和DuNode; 现用该链表存放字符串,编写一个算法,判断该字符串是否中心对称关系。例如字符串“ “xyzyx ” 都是中心对称的。【答案】int fun(DuNode *h ) p=h-next;q=h-prior;while(p!=q & p-prior!=q) if(q-data=p-data) p=p-next;q=q-prior; else return 0;return 1;31.假设以带头结点的单链表表示线性表,单链表的类型定义如下: typedef int DataType; typedef struct node DataType data; struct node * next;( 假设最大值唯一存在 )。函数原型为: LinkNode, * LinkList; 编写算法,删除线性表中最大元素 void f34(LinkList head) ;【答案】void f34(LinkList head)int e;指向最大值的那个结点LinkList p,q,s,spre; /s spre=head; s=head-next; q=s; p=s-next; while (p) if(s-datadata) s=p; spre=q; q=p;p=p-next; e=s-data; spre-next=s-next; free(s);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1