2

题目1:如果哈夫曼树有67个结点,则可知叶结点总数为:

A.: 22

B. 33

C. 34

D. 不确定

因为哈夫曼树没有n1,即没有只有一个子节点的节点,又因为n0 = n2-1

n0+n2 = 67,所以求得n0 = 34

题目2:为五个使用频率不同的字符设计哈夫曼编码,下列方案中哪个不可能是哈夫曼编码?

A. 00,100,101,110,111

B. 000,001,01,10,11

C. 0000,0001,001,01,1

D. 000,001,010,011,1

可以构造树。

画出来第一个发现就是不可能的,要知道,这里的又没有开头就是0的其他编码,怎么能直接来个00呢。

即如果把A选项的00变为0,这就是哈夫曼编码了。答案选A。

题目3:一段文本中包含对象{a,b,c,d,e},其出现次数相应为{3,2,4,2,1},则经过哈夫曼编码后,该文本所占总位数为:

经过画图可以得到:

经过计算,编码后总长度为27

其实还可以形成另一种哈夫曼树,结果都一样,这里懒得画圈了:

题目4:已知a、b两个元素均是所在集合的根结点,且分别位于数组分量3和2位置上,其parent值分别为-3,-2。问:将这两个集合按集合大小合并后,a和b的parent值分别是多少?

A. -5,2

B. -5,3

C. -3,3

D. 2,-2

要把parent绝对值小的并入绝对值大的上面,所以-3要加-2,为-5

然后原parent的值为-2的集合应该把父集合指引设为3

最后答案为B

题目6:用数组表示的集合中,如何让并查树更矮?

在向上查找根结点的同时将该元素指向根结点,就可以把路径缩短。

现采用大小为10的数组实现一个循环队列。设在某一时刻,队列为空且此时front和rear值均为5。经过若干操作后,front为8,rear为2,问:此时队列中有多少个元素?
A.4
B.5
C.6
D.7

答案:A

解析:

若队尾>队头
队列元素个数=队尾指针-队头指针
若队头>队尾
队列元素个数=队尾指针-队头指针+队列容量

  1. 如果一堆栈的输入序列是aAbBc,输出为 abcBA,那么该堆栈所进行的操作序列是什么? 设P代表入栈,O代表出栈。

首先第一个输入是a ,第一个输出也是a,我们把a进栈,然后再弹出去就可以了:

操作为 PO。

然后,第二个输入是A,进栈,但是不能这个时候弹出去,因为第二个输出应该是b,正好第三个输入为b,

操作为PPO。

然后第四个输入为B,第三个弹出为c,栈里没有c,故继续读取,读到c,弹出。

操作为PPO 现在栈里还有两个数:a , b

所以按顺序出栈即可:OO

最后连起来,即 POPPOPPOOO

  1. 若用单向链表实现一个堆栈,当前链表状态为:1->2->3。当对该堆栈执行pop()、push(4)操作后,链表状态变成怎样?

首先注意单向链表只能用栈头结点代表栈顶,因为单向链表只能指向下一个元素,而不能指向前面的元素,故如果栈顶是链表尾,则弹栈以后无法得到新的栈顶。

所以1是栈顶。弹栈,4进栈以后,答案是 4->2->3

单向线性链表实现堆栈,为什么不能用链表的尾部作为栈顶?

考虑用单向链表的尾部作为栈顶,先后执行下述操作。
1、连续入栈操作
假设初始是个空栈,连续压入三个元素。嗯!这样是没问题的,但是——
2、连续出栈操作
经过步骤一,我们现在有三个元素了,现在来把它们依次弹出。第一个元素(第三个被压入的元素):“我出来了,里面的弟弟快跟上!”但是——他怎么晓得里面的弟弟在哪里?链表是单向的啊,只有上一个弟弟晓得他在哪里,他是不知道上一个弟弟在哪里的,over!出栈操作大失败。
所以说嘛,单向线性链表实现堆栈,是不能用链表的尾部作为栈顶滴!

posted @ 2024-09-11 17:21  莫之白  阅读(57)  评论(0)    收藏  举报