题目描述
已知树形结构的所有节点信息,现要求根据输入坐标(x,y)找到该节点保存的内容值,其中x表示节点所在的层数,根节点位于第0层,根节点的子节点位于第1层,依次类推;y表示节点在该层内的相对偏移,从左至右,第一个节点偏移0,第二个节点偏移1,依次类推;
举例:上图中,假定圆圈内的数字表示节点保存的内容值,则根据坐标(1,1)查到的内容值是23。
输入描述
每个节点以一维数组(int[])表示,所有节点信息构成二维数组(int[][]),二维数组的0位置存放根节点;
表示单节点的一维数组中,0位置保存内容值,后续位置保存子节点在二维数组中的索引位置。
对于上图中:
- 根节点的可以表示为{10,1,2},
- 树的整体表示为{{10,1,2},{-21,3,4},{23,5},{14},{35},{66}}
查询条件以长度为2的一维数组表示,上图查询坐标为(1,1)时表示为{1,1}
使用Java标准IO键盘输入进行录入时,
对于上述示例为:
6
10 1 2
-21 3 4
23 5
14
35
66
1 1
输出描述
查询到内容时,输出{内容值},查询不到时输出{}
上图中根据坐标(1,1)查询输出{23},根据坐标(1,2)查询输出{}
用例
输入 | 6 10 1 2 -21 3 4 23 5 14 35 66 1 1 |
输出 | {23} |
说明 | 无 |
2023.1.16新增用例说明,之前代码只是根据用例1写的,误以为题目中说的树是二叉树,因此代码存在问题,后面发现了原题更多的用例说明,意识到本题的树是多叉树,但是本题代码中多叉树的处理逻辑和二叉树相同,只需要微调代码即可
输入 | 14 0 1 2 3 4 -11 5 6 7 8 113 9 10 11 24 12 35 66 13 77 88 99 101 102 103 25 104 2 5 |
输出 | {102} |
说明 | 无 |
输入 | 14 0 1 2 3 4 -11 5 6 7 8 113 9 10 11 24 12 35 66 13 77 88 99 101 102 103 25 104 3 2 |
输出 | {} |
说明 | 无 |
解题思路分析
题目给出了一个树形结构的节点信息,要求我们根据给定的坐标 (x,y)(x, y)(x,y) 查找到该节点存储的内容。我们可以通过以下步骤来解决这个问题:
-
输入解析:
- 首先读取节点的数量。
- 读取每个节点的内容信息,包括节点的值、层数、节点在层中的位置。
-
构建节点信息:
- 使用一个二级列表来存储节点信息,列表的第一个元素存储节点值,第二个元素存储其层数,第三个元素存储在层中的位置。
-
查找节点:
-
输出结果:
- 如果找到对应的节点值,则输出该值;如果未找到,则输出
{}
。
C++ 代码实现
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<vector<int>> tree(n, vector<int>(3));
for (int i = 0; i < n; ++i) {
cin >> tree[i][0] >> tree[i][1] >> tree[i][2];
}
int x, y;
cin >> x >> y;
bool found = false;
for (int i = 0; i < n; ++i) {
if (tree[i][1] == x && tree[i][2] == y) {
cout << "{" << tree[i][0] << "}" << endl;
found = true;
break;
}
}
if (!found) {
cout << "{}" << endl;
}
return 0;
}
Python 代码实现
def main():
n = int(input())
tree = []
for _ in range(n):
node = list(map(int, input().split()))
tree.append(node)
x, y = map(int, input().split())
found = False
for node in tree:
if node[1] == x and node[2] == y:
print(f"{{{node[0]}}}")
found = True
break
if not found:
print("{}")
if __name__ == "__main__":
main()
解题说明
-
输入解析:首先读取节点的数量 n
,然后读取每个节点的信息,包括节点的值、层数、在层中的位置。将这些信息存储在一个二维列表或数组中。
-
查找节点:遍历所有节点,检查每个节点的层数和位置是否与输入的坐标 (x,y)(x, y)(x,y) 匹配,如果匹配则输出对应节点的值。
-
结果输出:如果找到匹配的节点,则输出其值;如果没有找到,输出一个空集合 {}
。
这个问题相对简单,通过线性搜索可以找到所需节点的值,但如果数据量较大,可能需要优化搜索过程,例如使用哈希表进行快速查找。