首页 > 其他分享 >查找树中元素

查找树中元素

时间:2023-08-08 18:35:25浏览次数:24  
标签:11 nodeList int 元素 queue -- 查找 树中 节点

题目描述

已知 树形结构 的所有节点信息,现要求根据输入坐标查找树中元素_子节点找到该节点保存的内容值

其中查找树中元素_List_02表示节点所在的层数,根节点位于第查找树中元素_子节点_03层,根节点的子节点位于第查找树中元素_子节点_04层,依次类推

查找树中元素_用例_05表示节点在该层内的相对偏移,从左至右,第一个节点偏移查找树中元素_子节点_03,第二个节点偏移查找树中元素_子节点_04,依次类推

查找树中元素_List_08

ex:如上图,假定圆圈内的数字表示节点保存的内容值,则根据坐标查找树中元素_用例_09查到的内容值是 查找树中元素_用例_10

输入描述

每个节点以一维数组 int[]表示所有节点信息构成二维数组 int[][]二维数组的0位置存放根节点表示单节点的一维数组中,0位置保存内容值,后续位置保存子节点在二维数组中的索引位置。对于上图中:

  • 根节点的可以表示为
  • 表示根节点的内容值是10,其有两个子节点,在二维数组中的索引分别是 1 和 2
  • 树的整体表示为{{10, 1, 2},{-30, 3, 4},{25, 5},{14},{35},{66}}
  • 查询条件以长度为2的一维数组表示,上图查询坐标为(2,3)时表示为(2,3)
  • 使用Java标准IO键盘输入进行录入时.
  1. 先录入节点数量
  2. 然后逐行录入节点
  3. 最后录入查询的位置

对于上述示例为:

6
10 1 2
-30 3 4
25 5
14
35
66
2 2

输出描述

查询到内容时,输出{内容值},查询不到时输出{}上述例子中根据坐标(2,2)查询输出{66},根据坐标(2,3)查询输出{}

用例

用例1

--输入
6
10 1 2
-30 3 4
25 5
14
35
66
2 2

--输出
{66}

--说明
无

用例2

--输入
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}

--说明
无

用例3

--输入
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

--输出
{}

--说明
无

用例4

--输入
1
1000
0 0

--输出
{1000}

--说明
无

题目解析

  • 首先是对原始数据的接收,适合用 List<List<Integer>> 类型的结构来接收
  • 那么接下来该怎么处理呢?
  • 不如假设现在有了这样一颗树,从第 0 层开始,每一层从 第 0 个节点开始
  • 那么目标就是求:第 x 层的,第 y 个节点,BFS 可以解决
  • 那么现在的问题就是如何处理原始数据并建树了
  • 根据用例数据可以知道,需要建立一颗多叉树
  • 具体的建树逻辑过程呢?
  • 首先从第一个节点数组开始遍历.
  • ex:[0, 1, 2, 3, 4] 这里表示了 根节点有四个子节点,那么该怎么办呢?
  • 依次处理这四个子节点,加入到根节点集合中去。
  • 那么现在问题来了,索引下标为 1 的节点被处理过了,那么来到节点 1 数据集合
  • ex: -11 5 6 7 8 其值为 -11 ,现在很显然 -11 已经被加入到树结构中了,那么现在如何判断树结构中已经有了 11
  • 这一点好像不太好处理.
  • 那么换一种思路,dfs 建树.
  • 对于原始集合List<List<Integer>>中的每一个子list都有着相同的逻辑
  • 签名函数需要有什么呢?首先可以肯定的是,能够拿到当前的子 list
  • 签名函数和终止条件
  • 其父节点,因为要把当前节点加入到其父节点中去.
  • 然后处理其子节点,如果没有子节点,那么逻辑执行到当前节点加入到父节点集合中就可以结束了

show code

package com.hw;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

/**
 * desc :  <a href="https://fcqian.blog.csdn.net/article/details/128274181">查找树中元素</a>
 * <p>
 * create time : 2023/7/28 10:12
 */
public class TreeSearchEle {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNextLine()) {
            int nodeNum = Integer.parseInt(in.nextLine());

            List<List<Integer>> nodeList = new ArrayList<>();
            for (int i = 0; i < nodeNum; i++) {
                String[] split = in.nextLine().split(" ");
                List<Integer> node = new ArrayList<>();
                for (String s : split) {
                    node.add(Integer.parseInt(s));
                }
                nodeList.add(node);
            }

            String[] coordinate = in.nextLine().split(" ");
            int x = Integer.parseInt(coordinate[0]);
            int y = Integer.parseInt(coordinate[1]);

            treeSearchEle(nodeNum, nodeList, x, y);
        }
    }

    private static void treeSearchEle(int nodeNum, List<List<Integer>> nodeList, int x, int y) {
        // step 1. dfs建树.
        MultiTree root = dfs(null, nodeList, 0);

        // step 2. 查树.
        LinkedList<MultiTree> queue = new LinkedList<>();
        queue.offer(root);
        int level = 0;
        while(!queue.isEmpty()) {
            int sz = queue.size();
            if(level == x) {
                if(sz < y + 1) {
                    System.out.println("{}");
                    return;
                }
                while (y > 0) {
                    queue.removeFirst();
                    y--;
                }
                int val = queue.getFirst().val;
                System.out.println("{"+val+"}");
                return;
            }

            for (int i = 0; i < sz; i++) {
                if(queue.getFirst().child != null && queue.getFirst().child.size() > 0) {
                    queue.addAll(queue.removeFirst().child);
                } else {
                    queue.removeFirst();
                }
            }
            level++;
        }
    }

    //  idx : 当前节点的索引.
    private static MultiTree dfs(MultiTree parent, List<List<Integer>> nodeList, int idx) {

        // 创建当前节点
        MultiTree localNode = new MultiTree(nodeList.get(idx).get(0));
        if(localNode.child == null && nodeList.get(idx).size() > 1) {
            localNode.child = new ArrayList<MultiTree>();
        }

        // 处理当前节点的子节点
        for (int i = 1; i < nodeList.get(idx).size(); i++) {
            localNode.child.add(dfs(localNode, nodeList, nodeList.get(idx).get(i)));
        }

        return localNode;
    }

}

class MultiTree {

    public int val;

    public List<MultiTree> child;

    public MultiTree(int val) {
        this.val = val;
    }
}

标签:11,nodeList,int,元素,queue,--,查找,树中,节点
From: https://blog.51cto.com/u_16079703/7011107

相关文章

  • 列表元素查找关键词 字符串查找关键词
    字符串查找关键词https://blog.csdn.net/zhuhai__yizhi/article/details/77582200列表元素查找关键词[iforiindf_上海投入.columnsif'卷号'ini]......
  • Java入门题-查找一个字符串中,所有想查找短字符串的起始位置
    问题:就是长短两串字符串,从长字符串中查找所有短字符串在长字符串中的位置方法:用截取方式来规避已经查找过的内容,重复遍历来确定位置代码:需要引用importjava.util.Scanner; Scanners=newScanner(System.in);//新定义一个ScannerStringS=s.next();......
  • Altium Designer 18 查找元件库,助手的使用
    图片1中,搜索库使用的是快捷的查询过滤器,底部的【助手】是使用不了的。图片2中查询【助手】可以使用了,点击【助手】,出现查询的运算符,自定义一条语句查询。【助手】出现的操作方法:点击【高级】小三角这里。......
  • 代码随想录算法训练营第十三天| 239. 滑动窗口最大值 347.前 K 个高频元素 总结
    239.滑动窗口最大值 (一刷至少需要理解思路)    卡哥建议:之前讲的都是栈的应用,这次该是队列的应用了。本题算比较有难度的,需要自己去构造单调队列,建议先看视频来理解。    题目链接/文章讲解/视频讲解:https://programmercarl.com/0239.%E6%BB%91%E5%8A%A8%E7%AA%......
  • 解决 Blazor 中因标签换行导致的行内元素空隙问题
    实践过不同前端框架的朋友应该都知道,对于同一个样式,在不同框架上的表现都会有不同,时时需要做“适配”,在Blazor上也不例外。在做AntDesignBlazor时就深有体会,因为我们是同步官方的样式,他们的样式只考虑了React上的实现,除非有人专门提PR,否则都不会特别考虑其他框架的实现。......
  • 解决 Blazor 中因标签换行导致的行内元素空隙问题
    实践过不同前端框架的朋友应该都知道,对于同一个样式,在不同框架上的表现都会有不同,时时需要做“适配”,在Blazor上也不例外。在做AntDesignBlazor时就深有体会,因为我们是同步官方的样式,他们的样式只考虑了React上的实现,除非有人专门提PR,否则都不会特别考虑其他框架的实现。......
  • 解决 Blazor 中因标签换行导致的行内元素空隙问题
    实践过不同前端框架的朋友应该都知道,对于同一个样式,在不同框架上的表现都会有不同,时时需要做“适配”,在Blazor上也不例外。在做AntDesignBlazor时就深有体会,因为我们是同步官方的样式,他们的样式只考虑了React上的实现,除非有人专门提PR,否则都不会特别考虑其他框架的实现。......
  • 解决 Blazor 中因标签换行导致的行内元素空隙问题
    实践过不同前端框架的朋友应该都知道,对于同一个样式,在不同框架上的表现都会有不同,时时需要做“适配”,在Blazor上也不例外。在做AntDesignBlazor时就深有体会,因为我们是同步官方的样式,他们的样式只考虑了React上的实现,除非有人专门提PR,否则都不会特别考虑其他框架的实现。......
  • 平衡二叉查找树--splay
    splay树,又称伸展树,是一种平衡二叉查找树,通过不断把每个节点旋转到根节点能够在O(logN)的时间内完成插入、查找以及删除的操作,并且能保持平衡不会退化成链一、关于二叉查找树首先,二叉查找树肯定是个二叉树(废话),每个节点的左子节点的值小于该节点的值小于右子节点的值。这......
  • php中计算二维数组中某一元素之和
    [0] => array(5){    ["id"] => string(2) "11"    ["name"] => string(5) "1.jpg"    ["suffix"] => string(3) "jpg"    ["url"] => string(29) "./Uploads/1/5292f55d208e......