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
解析:
若队尾>队头
队列元素个数=队尾指针-队头指针
若队头>队尾
队列元素个数=队尾指针-队头指针+队列容量
- 如果一堆栈的输入序列是aAbBc,输出为 abcBA,那么该堆栈所进行的操作序列是什么? 设P代表入栈,O代表出栈。
首先第一个输入是a ,第一个输出也是a,我们把a进栈,然后再弹出去就可以了:
操作为 PO。
然后,第二个输入是A,进栈,但是不能这个时候弹出去,因为第二个输出应该是b,正好第三个输入为b,
操作为PPO。
然后第四个输入为B,第三个弹出为c,栈里没有c,故继续读取,读到c,弹出。
操作为PPO 现在栈里还有两个数:a , b
所以按顺序出栈即可:OO
最后连起来,即 POPPOPPOOO
- 若用单向链表实现一个堆栈,当前链表状态为:1->2->3。当对该堆栈执行pop()、push(4)操作后,链表状态变成怎样?
首先注意单向链表只能用栈头结点代表栈顶,因为单向链表只能指向下一个元素,而不能指向前面的元素,故如果栈顶是链表尾,则弹栈以后无法得到新的栈顶。
所以1是栈顶。弹栈,4进栈以后,答案是 4->2->3
单向线性链表实现堆栈,为什么不能用链表的尾部作为栈顶?
考虑用单向链表的尾部作为栈顶,先后执行下述操作。
1、连续入栈操作
假设初始是个空栈,连续压入三个元素。嗯!这样是没问题的,但是——
2、连续出栈操作
经过步骤一,我们现在有三个元素了,现在来把它们依次弹出。第一个元素(第三个被压入的元素):“我出来了,里面的弟弟快跟上!”但是——他怎么晓得里面的弟弟在哪里?链表是单向的啊,只有上一个弟弟晓得他在哪里,他是不知道上一个弟弟在哪里的,over!出栈操作大失败。
所以说嘛,单向线性链表实现堆栈,是不能用链表的尾部作为栈顶滴!

浙公网安备 33010602011771号