华南理工大学网络教育学院 数据结构同步练习册答案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A B E B A C
树、 二叉树
C
F
G
D
E
F
G
D
H I
H
I
J
J
答: 左Байду номын сангаас的图形 1)A 2)D,J 3)E 右边的图形 1)A 2)D,H,I,J,F,G 3)C 4)C,A 5)H,I,J 6)E 兄弟:D , C 兄弟: B 7) 2 和 4 6.2 分别画出含 3 个结点的无序树与二叉树的所有不同形态。 答: 4)E,A 5)G,H,I,J 6)E 兄弟:B , C 兄弟: F,G 7) 2 和 5
(5) int x = 0;
for (int i =1; i <= n; i++) for (int j =1; j<=i; j++) for (int k = 1; k <= j; k++) 答:n /2+n (6) int x = n, y = 0; // n>1 while (x >= (y+1)*(y+1)) y++; 答: y -1 解析:
2.4 已知单链表 L 中的结点是按值非递减有序排列的。 试写一算法将值为 x 的结结点插入表 L 中,使得 L 仍然有序。 答: 因已知顺序表 L 是按值非递减有序表, 所以只要从头找起找到第一个比它大(或相等) 的结点数据,把 x 插入到这个数所在的位置就可以了。
2.5 假设分别以两个元素值递增有序的线性表 A, B 表示两个集合 (即同一个线性表中的元素 各不相同) 。现要求构成一个新的线性表 C。C 表示集合 A 与 B 的交,且 C 中元素也递增有 序。试分别以下顺序表和单链表为存储结构,编写实现上述运算的算法。 答:
第1章 习题 1
绪论
1.1 什么是数据、数据元素、原子元素?,它们有何区别?。 答:数据:用以描述客观事物的数、字符以及所有能被计算机接受和处理的符号的集合 称为数据。例如整数、实数、字符、字符串、表格及各种图像、声音等。数据元素:就是数 据的基本单位,在某些情况下,数据元素也称为元素、结点、顶点、记录。数据元素有时可 以由若干数据项组成。原子元素是物理学的概念。 1.2 分析下列程序段的运行时间(时间复杂度) 。 void mystery (int n) { int i, j, k; for (i =1; i < n; i++) for (j = i+1; j <= n; j++) for (k = 1; k<= j; k++); } 答:O(n3) void odd (int n) { int i, j, x = 0, y = 0; for (i =1; i <= n; i++) if odd(i) { for(j = i; j <= n; j++) for( j = 1; j <= i; j++) } }
2
x++;
由 x=n 且 x 的值在程序中不变,又 while 的循环条件(x>=(y+1)*(y+1))可知:当 (y+1)*(y+1)刚超过 n 的值时退出循环。
由(y+1)*(y+1)<n 得:y<n^0.5-1 所以,该程序段的执行时间为:向下取整(n^0.5-1) 第2章 习题 2 2.1 描述以下三个概念的区别:头指针、头结点、首元结点。此外叙述有序表的特性何在?, 以及向量与有序表的异同点?,头指针变量和头结点的作用?。并比较顺序存储结构和链式存 储结构的优缺点。 答:首元结点是指链表中的第一个结点,也就是没有直接前驱的那个结点。链表的头指 针是一指向链表开始结点的指引(没有头结点时)。单链表由头指针唯一确定,因此单链表可 以用头指针的名字来命名。头结点是人为地在链表的开始结点之前附加的一个结点。有了头 结点之后.头指针指向头结点,不论链表是否为空,头指针总是非空。而且头指针的设置使 得对链表的第一个位置的操作与在表其他位置上的操作一致(都是在某一结点之后)。 2.2 试写出将链表 L 从某元素 R 处分成两个链表 L 和 K 的算法。R 为 K 表的第一个元素。 答:提示:链表最终将分成两个链表。处理好 L 的尾结点(即 R 的前驱结点) ,和 K 的 头结点(R) 。 void depart_Node(Node *head,int R,Node *head_K) { Node *p=head,*temp; while(p){if(p->data=R)break;temp=p;p=p->next;} temp->next=NUll; head_k->next=p; } 2.3 给定一个 n 项元素的线性表 V,写一个过程,将元素排列的次序颠倒过来。要求占用原 来的空间,并且用顺序表和单表两种方法表示(要求用最少的附加空间来完成) 。 答: 线性表
x++; y++;
答:O(n2) void recursive (int n) { if (n <= 1) return 1; else return (recursive (n -1) + recursive(n -1)); } 答:O(n) 1.3 设 n 为正整数,试确定下列各程序段中带标号@的语句的频度。
第3章 习题 3
栈、队列
3-1 对于一个适当大小的栈,设输入项序列为 A、B、C、D、E。为得到下列的处理序列,需 要做什么样的运算序列(由 PUSH、POP 组成)?。如果其中某处理序列得不到时,试说明理 由?:① A、B、C、D、E;② B、C、D、E、A;③E、A、B、C、D;④ E、D、C、B、A。 答 : ① PUSH(A), POP(A), PUSH(B), POP(B), PUSH(C), POP(C), PUSH(D), POP(D), PUSH(E), POP(E) ②PUSH(A), PUSH(B), POP(B), PUSH(C), POP(C), PUSH(D), POP(D), PUSH(E), POP(E), POP(A) ③无法实现。 ④PUSH(A), PUSH(B), PUSH(C), PUSH(D), PUSH(E), POP(E), POP(D), POP(C), POP(B), POP(A) 3-2 用链表存放着 n 个字符, 试用算法判断读字符串是否有中心对称关系。 例如 abccba, abcba 都算是中心对称的字符串。要求用尽可能少的时间完成判断(提示:将一半的字符先依次进 栈) 。 答:
6.5 将下图所示的森林转换成二叉树。
A G L
B
C
H
M
N
O
D
E
F
I
J
K Q
P R
答:
6.6 分别画出下图所示各二叉树对应的森林。
A A C B A B C G B A C D H B E I J A C F
答:
6.7 给定权值 7,18,3,32,5,26,12,8,构造相应的哈夫曼树。 答:按权值大小排列后 3 5 7 8 12 18 26 32 只要按照将最小的两个合并, 合并后的值再 入列中(最小的两个出列), 至到列中只有一个值.按上面要求构造哈夫曼树如下: /////树列完后, 可取左树编码 为 0, 右为 1, (左为 1, 右为 0 亦可) [3]`````[5]`````````[7]``````[8] ``\`````/`````````````\``````/ `0`\```/`1```````````0`\````/`1 ````\`/`````````````````\``/ ````(8)`````[12]````````(15)`````[18] ``````\``````/`````````````\``````/ `````0`\````/`1```````````0`\````/`1 ````````\``/`````````````````\``/ ````````(20)``````[26]```````(33)``````[32] ```````````\``````/`````````````\``````/
(4) int x = 91, y = 100;
while (y > 0) { if (x > 100) else x++; } 答:100 解析: x=91; //1 y=100; //1
{
x = x -10; y--;
}
while(y>0) //1101 if(x>100) //1100 { x=x-10; //100 y--; //100 } else x++; //1000 以上程序段右侧列出了执行次数。该程序段的执行时间为: T(n)=O(1)
while ( i <= n ) { k = k+10*i; i++; } 答:n-1
解析: i=1; //1 k=0; //1 while(i<n) //n { k=k+10*i; //n-1 i++; //n-1 } 由以上列出的各语句的频度,可得该程序段的时间消耗: T(n)=1+1+n+(n-1)+(n-1)=3n 可表示为 T(n)=O(n)
6.3 分别写出题 6.1 所示二叉树的先根,中根和后根序列。 答:先根:ABCDEFGHIJ 二叉树。 答: 由后根遍历序列得到二叉树的根结点 A (后根序列中最后一个结点) ; 在中序序列中, A 的左力是 A 的左子树上的结点,A 的右边是 A 的右子树上的结点;再到后根序列中找左子 树和右子树的根结点,依次类推,直到画出该二叉树。 中根:DCBAFEHJIG 后根:DCBFJIHGEA 6.4 已知一棵二叉树的中根序列和后根序列分别为 BDCEAFHG 和 DECBHGFA,试画出这棵
3-3 现有中缀表达式 E =( (100-4)÷3 + 3×(36-7) )×2,写出与 E 等价的后缀表达式。 并用栈来模拟表达式的转换过程,画出转换过程中栈的内容的变化图。 答:100 4 – 3 ÷ 3 36 7 - × + 2 × 图略。
第4章 习题 4
多维数组、广义表、串
4.1 现有三个数组 A[n+1], B[n+1][m]和 C[n+1][n+2],试问各个数组能存放多少个元素。 答: n+1 答:152 4.3 已知下图为广义表的存储结构图,写出此图表示的广义表。 list 1 1 0 x 1 1 0 答:((x,(y)),((())),(),(z) ) 4.4 有广义表 A =( ) ,B =(A,e,d) ,C = (A),D = (e,(a,b,B),A,C)。 (1)画出上 述各广义表的图形。 (2)求表 D 的长度和深度; (3)画出 D 表的链表表示。 答: (2)长度:4 深度:2 4.5 简述下列每对术语的区别:空串和空格串;串变量和串常量,主串和子串,串变量的名 字与串变量的值。 答:详见课本。 4.6 在顺序串上实现串的判等运算 equal(s,t),在链串上实现判等运算 equal(s, t)的算法。 答: int StrComp(char *s1, char *s2) { int i=0; while (s1[i]==s2[i] && s1[i]!=’\0’) i++; return (s1[i]-s2[i]); } int StrComp(link *head1, link { link *p1,*p2; p1=head1->next; p2=head1->next; while (p1->data==p2->data && pa&&p2) {p1=p1->next;p2=p2->next;} *head2) y 1 1 1 1 1 1 1 0 z (n+1)*m (n+1)*(n+2) 4.2 有三维数组 A(2,3,4、 ) 、数组中元素长度为 4 个字节。试求元素 A232 的相对地址。
(1) int i =1, k = 0;
while (i <= n-1) 答:n-1
(2) int i =1, j = 0;
{ k = k +10*i; i = i+1; }
while ((i+j) <= n) if (i>j) j++; else i++; 答:n/2
(3) int i =1, k = 0;
if(p1||p2) return 0; else return 1; } 第6章 习题 6 6.1 分别就下图中的二叉树和树回答下列问题:①哪个是根结点?;②哪些是叶子结点?; ③哪 个是 G 的双亲?; ④哪些是 G 的祖先?; ⑤哪些是 E 的子孙?; ⑥哪些是 E 的兄弟?; 哪些是 C 的兄弟?; ⑦结点 B 和 I 的层数分别是多少?。
树、 二叉树
C
F
G
D
E
F
G
D
H I
H
I
J
J
答: 左Байду номын сангаас的图形 1)A 2)D,J 3)E 右边的图形 1)A 2)D,H,I,J,F,G 3)C 4)C,A 5)H,I,J 6)E 兄弟:D , C 兄弟: B 7) 2 和 4 6.2 分别画出含 3 个结点的无序树与二叉树的所有不同形态。 答: 4)E,A 5)G,H,I,J 6)E 兄弟:B , C 兄弟: F,G 7) 2 和 5
(5) int x = 0;
for (int i =1; i <= n; i++) for (int j =1; j<=i; j++) for (int k = 1; k <= j; k++) 答:n /2+n (6) int x = n, y = 0; // n>1 while (x >= (y+1)*(y+1)) y++; 答: y -1 解析:
2.4 已知单链表 L 中的结点是按值非递减有序排列的。 试写一算法将值为 x 的结结点插入表 L 中,使得 L 仍然有序。 答: 因已知顺序表 L 是按值非递减有序表, 所以只要从头找起找到第一个比它大(或相等) 的结点数据,把 x 插入到这个数所在的位置就可以了。
2.5 假设分别以两个元素值递增有序的线性表 A, B 表示两个集合 (即同一个线性表中的元素 各不相同) 。现要求构成一个新的线性表 C。C 表示集合 A 与 B 的交,且 C 中元素也递增有 序。试分别以下顺序表和单链表为存储结构,编写实现上述运算的算法。 答:
第1章 习题 1
绪论
1.1 什么是数据、数据元素、原子元素?,它们有何区别?。 答:数据:用以描述客观事物的数、字符以及所有能被计算机接受和处理的符号的集合 称为数据。例如整数、实数、字符、字符串、表格及各种图像、声音等。数据元素:就是数 据的基本单位,在某些情况下,数据元素也称为元素、结点、顶点、记录。数据元素有时可 以由若干数据项组成。原子元素是物理学的概念。 1.2 分析下列程序段的运行时间(时间复杂度) 。 void mystery (int n) { int i, j, k; for (i =1; i < n; i++) for (j = i+1; j <= n; j++) for (k = 1; k<= j; k++); } 答:O(n3) void odd (int n) { int i, j, x = 0, y = 0; for (i =1; i <= n; i++) if odd(i) { for(j = i; j <= n; j++) for( j = 1; j <= i; j++) } }
2
x++;
由 x=n 且 x 的值在程序中不变,又 while 的循环条件(x>=(y+1)*(y+1))可知:当 (y+1)*(y+1)刚超过 n 的值时退出循环。
由(y+1)*(y+1)<n 得:y<n^0.5-1 所以,该程序段的执行时间为:向下取整(n^0.5-1) 第2章 习题 2 2.1 描述以下三个概念的区别:头指针、头结点、首元结点。此外叙述有序表的特性何在?, 以及向量与有序表的异同点?,头指针变量和头结点的作用?。并比较顺序存储结构和链式存 储结构的优缺点。 答:首元结点是指链表中的第一个结点,也就是没有直接前驱的那个结点。链表的头指 针是一指向链表开始结点的指引(没有头结点时)。单链表由头指针唯一确定,因此单链表可 以用头指针的名字来命名。头结点是人为地在链表的开始结点之前附加的一个结点。有了头 结点之后.头指针指向头结点,不论链表是否为空,头指针总是非空。而且头指针的设置使 得对链表的第一个位置的操作与在表其他位置上的操作一致(都是在某一结点之后)。 2.2 试写出将链表 L 从某元素 R 处分成两个链表 L 和 K 的算法。R 为 K 表的第一个元素。 答:提示:链表最终将分成两个链表。处理好 L 的尾结点(即 R 的前驱结点) ,和 K 的 头结点(R) 。 void depart_Node(Node *head,int R,Node *head_K) { Node *p=head,*temp; while(p){if(p->data=R)break;temp=p;p=p->next;} temp->next=NUll; head_k->next=p; } 2.3 给定一个 n 项元素的线性表 V,写一个过程,将元素排列的次序颠倒过来。要求占用原 来的空间,并且用顺序表和单表两种方法表示(要求用最少的附加空间来完成) 。 答: 线性表
x++; y++;
答:O(n2) void recursive (int n) { if (n <= 1) return 1; else return (recursive (n -1) + recursive(n -1)); } 答:O(n) 1.3 设 n 为正整数,试确定下列各程序段中带标号@的语句的频度。
第3章 习题 3
栈、队列
3-1 对于一个适当大小的栈,设输入项序列为 A、B、C、D、E。为得到下列的处理序列,需 要做什么样的运算序列(由 PUSH、POP 组成)?。如果其中某处理序列得不到时,试说明理 由?:① A、B、C、D、E;② B、C、D、E、A;③E、A、B、C、D;④ E、D、C、B、A。 答 : ① PUSH(A), POP(A), PUSH(B), POP(B), PUSH(C), POP(C), PUSH(D), POP(D), PUSH(E), POP(E) ②PUSH(A), PUSH(B), POP(B), PUSH(C), POP(C), PUSH(D), POP(D), PUSH(E), POP(E), POP(A) ③无法实现。 ④PUSH(A), PUSH(B), PUSH(C), PUSH(D), PUSH(E), POP(E), POP(D), POP(C), POP(B), POP(A) 3-2 用链表存放着 n 个字符, 试用算法判断读字符串是否有中心对称关系。 例如 abccba, abcba 都算是中心对称的字符串。要求用尽可能少的时间完成判断(提示:将一半的字符先依次进 栈) 。 答:
6.5 将下图所示的森林转换成二叉树。
A G L
B
C
H
M
N
O
D
E
F
I
J
K Q
P R
答:
6.6 分别画出下图所示各二叉树对应的森林。
A A C B A B C G B A C D H B E I J A C F
答:
6.7 给定权值 7,18,3,32,5,26,12,8,构造相应的哈夫曼树。 答:按权值大小排列后 3 5 7 8 12 18 26 32 只要按照将最小的两个合并, 合并后的值再 入列中(最小的两个出列), 至到列中只有一个值.按上面要求构造哈夫曼树如下: /////树列完后, 可取左树编码 为 0, 右为 1, (左为 1, 右为 0 亦可) [3]`````[5]`````````[7]``````[8] ``\`````/`````````````\``````/ `0`\```/`1```````````0`\````/`1 ````\`/`````````````````\``/ ````(8)`````[12]````````(15)`````[18] ``````\``````/`````````````\``````/ `````0`\````/`1```````````0`\````/`1 ````````\``/`````````````````\``/ ````````(20)``````[26]```````(33)``````[32] ```````````\``````/`````````````\``````/
(4) int x = 91, y = 100;
while (y > 0) { if (x > 100) else x++; } 答:100 解析: x=91; //1 y=100; //1
{
x = x -10; y--;
}
while(y>0) //1101 if(x>100) //1100 { x=x-10; //100 y--; //100 } else x++; //1000 以上程序段右侧列出了执行次数。该程序段的执行时间为: T(n)=O(1)
while ( i <= n ) { k = k+10*i; i++; } 答:n-1
解析: i=1; //1 k=0; //1 while(i<n) //n { k=k+10*i; //n-1 i++; //n-1 } 由以上列出的各语句的频度,可得该程序段的时间消耗: T(n)=1+1+n+(n-1)+(n-1)=3n 可表示为 T(n)=O(n)
6.3 分别写出题 6.1 所示二叉树的先根,中根和后根序列。 答:先根:ABCDEFGHIJ 二叉树。 答: 由后根遍历序列得到二叉树的根结点 A (后根序列中最后一个结点) ; 在中序序列中, A 的左力是 A 的左子树上的结点,A 的右边是 A 的右子树上的结点;再到后根序列中找左子 树和右子树的根结点,依次类推,直到画出该二叉树。 中根:DCBAFEHJIG 后根:DCBFJIHGEA 6.4 已知一棵二叉树的中根序列和后根序列分别为 BDCEAFHG 和 DECBHGFA,试画出这棵
3-3 现有中缀表达式 E =( (100-4)÷3 + 3×(36-7) )×2,写出与 E 等价的后缀表达式。 并用栈来模拟表达式的转换过程,画出转换过程中栈的内容的变化图。 答:100 4 – 3 ÷ 3 36 7 - × + 2 × 图略。
第4章 习题 4
多维数组、广义表、串
4.1 现有三个数组 A[n+1], B[n+1][m]和 C[n+1][n+2],试问各个数组能存放多少个元素。 答: n+1 答:152 4.3 已知下图为广义表的存储结构图,写出此图表示的广义表。 list 1 1 0 x 1 1 0 答:((x,(y)),((())),(),(z) ) 4.4 有广义表 A =( ) ,B =(A,e,d) ,C = (A),D = (e,(a,b,B),A,C)。 (1)画出上 述各广义表的图形。 (2)求表 D 的长度和深度; (3)画出 D 表的链表表示。 答: (2)长度:4 深度:2 4.5 简述下列每对术语的区别:空串和空格串;串变量和串常量,主串和子串,串变量的名 字与串变量的值。 答:详见课本。 4.6 在顺序串上实现串的判等运算 equal(s,t),在链串上实现判等运算 equal(s, t)的算法。 答: int StrComp(char *s1, char *s2) { int i=0; while (s1[i]==s2[i] && s1[i]!=’\0’) i++; return (s1[i]-s2[i]); } int StrComp(link *head1, link { link *p1,*p2; p1=head1->next; p2=head1->next; while (p1->data==p2->data && pa&&p2) {p1=p1->next;p2=p2->next;} *head2) y 1 1 1 1 1 1 1 0 z (n+1)*m (n+1)*(n+2) 4.2 有三维数组 A(2,3,4、 ) 、数组中元素长度为 4 个字节。试求元素 A232 的相对地址。
(1) int i =1, k = 0;
while (i <= n-1) 答:n-1
(2) int i =1, j = 0;
{ k = k +10*i; i = i+1; }
while ((i+j) <= n) if (i>j) j++; else i++; 答:n/2
(3) int i =1, k = 0;
if(p1||p2) return 0; else return 1; } 第6章 习题 6 6.1 分别就下图中的二叉树和树回答下列问题:①哪个是根结点?;②哪些是叶子结点?; ③哪 个是 G 的双亲?; ④哪些是 G 的祖先?; ⑤哪些是 E 的子孙?; ⑥哪些是 E 的兄弟?; 哪些是 C 的兄弟?; ⑦结点 B 和 I 的层数分别是多少?。