本文将提到在牛客网刷题中遇到的各类知识点:线性表的概念、哈夫曼树、时间复杂度等多方面知识点并赋实际题目。
对于同一个线性表,其每一个数据元素的值虽然不同,但必须具有相同的数据类型;
数据元素之间具有一种线性的或“一对一”的逻辑关系。
考题:线性表的链表易于插入/删除,顺序表易于寻址
赫夫曼树,别名“哈夫曼树”、“最优树”以及“最优二叉树”。
路径: 在一棵树中,一个结点到另一个结点之间的通路,称为路径。图 1 中,从根结点到结点 a 之间的通路就是一条路径。
路径长度: 在一条路径中,每经过一个结点,路径长度都要加 1 。例如在一棵树中,规定根结点所在层数为1层,那么从根结点到第 i 层结点的路径长度为 i - 1 。图 1 中从根结点到结点 c 的路径长度为 3。
结点的权: 给每一个结点赋予一个新的数值,被称为这个结点的权。例如,图 1 中结点 a 的权为 7,结点 b 的权为 5。
结点的带权路径长度: 指的是从根结点到该结点之间的路径长度与该结点的权的乘积。例如,图 1 中结点 b 的带权路径长度为 2 * 5 = 10 。
树的带权路径长度为树中所有叶子结点的带权路径长度之和。通常记作 “WPL” 。例如图 1 中所示的这颗树的带权路径长度为:
WPL = 7 * 1 + 5 * 2 + 2 * 3 + 4 * 3
什么是哈夫曼树?
当用n个节点(都做叶子结点,且都有各自的权值)构建一棵树时,如果构建的这棵树的带权路径长度最小,称这棵树为 “最优二叉树” ,有时候也叫赫夫曼树或者哈夫曼树
在构建哈夫曼树的时候,为了使带权路径最小应遵循一个原则:
权重越大的节点离根节点越近,如上图,a的权重最大 ,故a离根节点最近,理应作为根节点的孩子节点。
构建哈夫曼树
在n个权值中选择两个最小的权值,构成一个新的二叉树
也就是说:
考题: 赫夫曼(huffman)树,在赫夫曼树中, 每次从候选集中选择最小的两个元素构建新的根节点,所以只存在度为0和2的节点,结点的度数只可能为0、2
前序遍历:根左右
中序遍历:左根右
后序遍历:左右根
eg:
前序:HGEDBFCA
中序:EGBDHFAC
分析:
1.由前序遍历知,H为根节点。
2.在中序遍历中,EGBD为左子树,FAC为右子树,对比前序遍历可得G和F作为第二层的根节点
3.将G,F作为根节点,看中序遍历,E为G的左节点,BD为右节点,在前序遍历中,D先于B,故D右节点,将D作为根节点,B的中序遍历在D的左边,故为左节点
4.右侧同理
总结:
前序遍历的第一个是整个树的根;
后序遍历的最后一个是整个树的根;
中序是用来判别左右子树划分的;
前序序列中左子树部分的第一个节点是左子树的根节点 ;
前序序列中右子树部分的第一个节点是右子树的根节点 ;
双向链表中有两个指针域,llink和rlink分别指向前驱和后继,设p指向链表中的一个结点,现要求删去p所指结点,则正确的删除是()(链中结点数大于2,p不是第一个结点)
答:
首先要更新p结点前后结点的指针域,然后删除P,所以做法是:
p -> link -> rlink = p -> rlink;
p -> rlink -> link = p -> link;
dispose§;
一个英雄基础攻击力为100,携带了三件暴击武器,武器A有40%的概率打出2倍攻击,武器B有20%的概率打出4倍攻击,武器C有10%概率打出6倍攻击,各暴击效果触发是独立事件,但是多个暴击效果在一次攻击中同时触发时只有后面武器的暴击真正生效,例如一次攻击中武器A判定不暴击,武器B和武器C都判定触发暴击,那么这次攻击实际是600攻击力。那么这个英雄攻击力的数学期望是____。
答:
也就是说 使用武器3的时候: 600 * 10%
使用武器2的时候,要确保不使用武器3: 400 * (1-10%) * 20%
使用武器1的时候,要确保不适用武器13 : 200 * (1-10%) * (1-20%)
不使用武器的时候:100 * (1-10%) * (1-20%) * (1-40%)
所以 总的数学期望为: (600 * 10%) +(400 * 90% * 20% )+(200 * 90% * 80% * 40%) +(100 * 60 % * 80% * 90%)= 232.8
下列选项中,不能构成折半查找中关键字比较序列的是____
500,200,450,180
500,450,200,180
180,500,200,450
180,200,500,450
答:
二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
通俗来讲: 那就是前一个元素要么大于后面每一个元素,要么小于后面每一个元素
对[21, 49, 84, 45, 12]进行基数排序,第一趟排序的结果为 ___
答:
对10取余 进行排序 即按照个位数的大小进行排序
也就是
21,12,84,45,49
排序时,若不采用计数排序的等空间换时间的方法,合并m个长度为n的已排序数组的时间复杂度最优为___
答:
当n=1时,就成了m个数的归并排序,时间复杂度为O(mlogm)
利用二叉链表存储树,则根结点的右指针是___
答:
二叉链表: 左孩子 右兄弟
由于根节点没有兄弟 所以为空