# 1、完全二叉树的中序遍历
题目
给定两个正整数 n 和 m
要求生成一棵完全二叉树,满足 左子叶 < 父节点 < 右子叶,节点值为 1~n
在这颗树中搜索 m,输出搜索路径,标准如下:
首先输出 S,表示搜索根节点,然后如果搜索 左/右子叶 则输出 L/R
最终搜索成功则输出 Y,失败则输出 N
思路
模拟生成树(复杂)和模拟搜索(简单)即可
生成时先生成一个特殊的最小堆(父节点 < 左子叶 < 右子叶)
然后依次遍历,交换不满足条件的节点
搜索时将 m 与当前节点比较,若m小/大则搜索左/右子叶节点
# 2、足球队员排序
题目
给出两个正整数 n 和 m
给出 n 个球员各射门 m 次的结果
1表示进球,0表示射失
要求按照如下标准对其进行排序
1. 首先比较总进球数,多的靠前,若相等继续比较下一条
2. 其次比较最多连续进球数,多的靠前,若相等继续比较下一条
3. 然后比较第一次射失时射门次数,多的靠前,若相等继续比较第二次,以此类推,若均相等则比较下一条
4. 最后比较队员编号,小的靠前
思路
模拟排序
第一个标准可以利用 ’统计一个二进制数中 1 的个数‘ 的函数
第二个标准用 双指针/滑动窗口 可以解决
第三个标准最难,本质上可以直接比较两个二进制数的大小,越大的数说明射失时射门次数更多,即二进制数前面的 1 更多
注意
可以利用 sort 函数的变体,即排序后返回 下标 而不是返回 值
# 3、图中环的 H 指数
题目
给出一个正整数 n,表示图中有 n 个节点
给出一个长度为 n-1 的数组 a,表示从 i 节点到 a[i] 节点有一条边
定义图中一个环的 H 指数 = V 指数 - G 指数
其中 V指数 为环中节点个数
G 指数为 图中与环连通 但是不在环中的节点数量
要求依次输出 H 指数最大的环中的节点
H 指数最大的不止一个环时,比较 V 指数,然后比较节点编号