2024华为OD试题及答案-A068-查找树中元素

题目描述

已知树形结构的所有节点信息,现要求根据输入坐标(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键盘输入进行录入时,

  1. 先录入节点数量
  2. 然后逐行录入节点
  3. 最后录入查询的位置

对于上述示例为:

 

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
输出{}
说明
输入1
1000
0 0
输出{1000}
说明

解题思路分析

题目给出了一个树形结构的节点信息,要求我们根据给定的坐标 (x,y)(x, y)(x,y) 查找到该节点存储的内容。我们可以通过以下步骤来解决这个问题:

  1. 输入解析

    • 首先读取节点的数量。
    • 读取每个节点的内容信息,包括节点的值、层数、节点在层中的位置。
  2. 构建节点信息

    • 使用一个二级列表来存储节点信息,列表的第一个元素存储节点值,第二个元素存储其层数,第三个元素存储在层中的位置。
  3. 查找节点

    • 根据给定的层数和位置,查找对应的节点值。
  4. 输出结果

    • 如果找到对应的节点值,则输出该值;如果未找到,则输出 {}

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()

解题说明

  1. 输入解析:首先读取节点的数量 n,然后读取每个节点的信息,包括节点的值、层数、在层中的位置。将这些信息存储在一个二维列表或数组中。

  2. 查找节点:遍历所有节点,检查每个节点的层数和位置是否与输入的坐标 (x,y)(x, y)(x,y) 匹配,如果匹配则输出对应节点的值。

  3. 结果输出:如果找到匹配的节点,则输出其值;如果没有找到,输出一个空集合 {}

这个问题相对简单,通过线性搜索可以找到所需节点的值,但如果数据量较大,可能需要优化搜索过程,例如使用哈希表进行快速查找。

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值