#jarch. 2026暑假CSP-J模拟赛03-T4 程老师的档案柜
2026暑假CSP-J模拟赛03-T4 程老师的档案柜
时间限制:1000ms 内存限制:512MB
题目描述
程老师的档案柜是一棵 个节点的二叉树,节点编号 互不相同。这棵树的每个节点都有值,但值的大小并不重要——重要的是节点之间的连接关系。
程老师在整理档案时,用两种不同的方式记录了这棵树的结构。第一种记录方式叫做前序遍历:先写下当前节点的编号,然后递归地写下左子树的所有节点,最后递归地写下右子树的所有节点。如果当前节点为空(没有节点),就什么都不写。
第二种记录方式叫做中序遍历:先递归地写下左子树的所有节点,然后写下当前节点的编号,最后递归地写下右子树的所有节点。如果当前节点为空,就什么都不写。
现在,程老师留下了这两份清单,但树本身已经找不到了。你需要根据这两份清单还原出树的结构,然后回答一些问题。
对于树中的每个节点,我们关心两个属性:
- 深度:从根节点到这个节点的路径上一共经过多少个节点(含根节点和该节点本身)。根节点的深度为 。
- 子树大小:以这个节点为根的子树中,包含多少个节点(包括这个节点本身)。
程老师会问你 个问题,每个问题给你一个节点编号 ,请你告诉他 的深度和子树大小。
输入格式
第一行两个整数 和 ,分别表示节点个数和询问次数。
第二行 个整数,表示这棵树的前序遍历结果。
第三行 个整数,表示这棵树的中序遍历结果。
接下来 行,每行一个整数 ,表示询问的节点编号。
输出格式
输出 行,每行两个整数,用空格隔开,分别表示节点 的深度和子树大小。
数据范围
- 两份清单保证是同一棵二叉树的前序与中序遍历结果。
| 测试点 | 特殊性质 | ||
|---|---|---|---|
| 1 | 5 | 无 | |
| 2~4 | 10 | 10 | |
| 5~8 | 2000 | ||
| 9~10 | 100 | A | |
| 11~14 | 无 | ||
| 15~16 | 1 | B | |
| 17~20 | 无 | ||
特殊性质 A:树退化为一条链(每个节点至多有一个孩子)。
特殊性质 B:。
样例
样例 1
输入:
5 4
1 2 4 5 3
4 2 5 1 3
1
2
4
3
输出:
1 5
2 3
3 1
2 1
样例 2
输入:
1 1
1
1
1
输出:
1 1
样例 3
输入:
4 2
1 2 3 4
1 2 3 4
2
4
输出:
2 3
4 1
样例解释
样例 1:从两份清单可以还原出树的结构。前序遍历的第一个元素 1 是根节点。在中序遍历中找到 1,它左边的 4 2 5 构成了左子树,右边的 3 构成了右子树。对于左子树,前序遍历中紧接着的 2 4 5 是左子树的前序,所以 2 是左子树的根。在中序遍历中,2 左边的 4 是左子树,右边的 5 是右子树。这样就还原出了完整的树。
对于节点 1:它是根节点,深度为 1,子树包含所有 5 个节点。 对于节点 2:它是 1 的左孩子,深度为 2,子树包含节点 2、4、5 共 3 个。 对于节点 4:它是 2 的左孩子,深度为 3,子树只包含它自己。 对于节点 3:它是 1 的右孩子,深度为 2,子树只包含它自己。
样例 3:当每个节点只有右孩子时,前序遍历和中序遍历的结果相同,都是 1 2 3 4。此时树退化成一条链:1 → 2 → 3 → 4。
- ID
- 694
- 类型
- 传统题
- Time Limit
- 1000ms
- Memory Limit
- 512MiB
- 上传者
相关
在下列比赛中: