解析:从题中右图 A0 出发深度优先遍历,有 4 种可能的路径,(a0,a1,a3,a2)(a0,a3,a1,a2)(a0,a2,a1,a3)(a0,a2,a3,a1)
因此不可能是(a0,a1,a2,a3)
解析:IPv4 协议使用 32 位地址,IPv6 协议则使用 128 位地址,可以有效地解决地址资源枯竭的问题。
解析:通常在搜索引擎中,对某个关键词加上双引号表示关键搜索,只显示包含整个关键词的结果。
解析:根据 IEEE 的规范,浮点数由符号位、尾码和阶码组成,在将 64 位浮点数强制转换成 32位浮点数时,符号位保留不点,尾码和阶码则可能由于精度问题改变它们的值。因此大于、小于、等于原数的情况都有可能出现。
解析:
i = 1;
do {
sum += i;
i++;
} while (i <= 100);
可以正确的计算 1,2,3,…,100之和,而
i = 1;
do {
sum += i;
i++;
} while (i > 100);
i = 1;
while (i >= 100) {
sum += i;
i++;
}
循环执行条件是 i > 100,显然在 i 初始等于 1的情况下,循环不会被执行。
i = 1;
while (i < 100) {
sum += i;
i++;
}
则只能求 1至 99的和。
解析:CCF NOIP 复赛全国统一评测时使用的系统软件是 NOI Linux。
解析:选择第一个同学共有 7 种选项,第二个同学由于不能相邻,只剩下4个可选,同时每对同学会被重复计算两次,因此一共有7*4/2=14种不同的选法
解析:由题意可以列出以下方程组:
(s1+s2)mod2=1
(s3+s4)mod2=0
(s2+s3)mod2=0
(s1+s2+s3)mod2=0
(s1)mod2=0
解得s1=0,s2=1,s3=1,s4=1
解析:本题功能:输入长度为 n的整数序列,求最长上升子序列的长度。所以答案为4
解析:
填空位置 ①:
n - p + i
填空位置 ②:
a[i]
填空位置 ③:
n
填空位置 ④:
i - p + 1
填空位置 ⑤:
a[i - p]
本题一共给出了 2种算法:
第一种是开一个临时数组,将后n - p个数和前p 个数依次拷贝到临时数组中,再把临时数组复制给当前数组。这一朴素的算法时间和空间复杂度均为 O(n)。
第二种是每次把整个数组往左移一位(最左边的移到最后),这样左移 pp次即是最终的数组。省去了O(n) 的临时空间,但是时间复杂度上升至O(n2)。
#include <iostream>
using namespace std;
const int SIZE = 100;
const int INFINITE = 1000000;
struct node {
int left_child, right_child, value;
};
node a[SIZE];
int is_bst(int root, int lower_bound, int upper_bound){
int cur;
if (root == 0)return 1;
cur = a[root].value;
if ((cur > lower_bound) && ( ① ) &&
(is_bst(a[root].left_child, lower_bound, cur) == 1) && (is_bst(②,③,④) == 1))
return 1;
return 0;
}
int main(){
int i, n;
cin>>n;
for (i = 1; i <= n; i++)
cin>>a[i].value>>a[i].left_child>>a[i].right_child;
cout<<is_bst( ⑤ , -INFINITE, INFINITE)<<endl;
return 0;
}
解析:
填空位置 ①:
cur < upper_bound
填空位置 ②:
a[root].right_child
填空位置 ③:
cur
填空位置 ④:
upper_bound
填空位置 ⑤:
1
题目要求检查输入的二叉树是否为二叉查找树,试题中使用了一个较为巧妙的函数is_bst来判断:
a)当前子树是否为二叉查找树
b)当前子树所有的值是否在区间 [lower_bound, upper_bound]内。
初始时,我们从根节点出发,并将 lower_bound,upper_bound 分别设为无穷小、无穷大。我们去检验当前该点值是否符合传递下来的范围,也就是是否在区间 [lower_bound, upper_bound]内。然后,检验左子树是否是二叉查找树,右子树是否是二叉查找树,如果 2 个子树都是二叉查找树,同时当前点的值也在范围内,说明以当前点为根的树也是二叉查找树。
剩下的问题就是如何检验子树是否是二叉查找树,这个问题利用递归就可以来解决,直接调用is_bst,同时传递子树以及更新边界的值,即[lower_bound, upper_bound],如果是左子树则将 upper_bound 修改为 cur,如果是右子树则将 lower_bound 修改为 cur。直到发现root == 0也就是当前点为空,证明递归到终点。