牛客ONT45 距离是K的二叉树节点【中等 宽度优先遍历 Java/Go/PHP】

news2025/1/12 10:38:20

题目

在这里插入图片描述
题目链接:
https://www.nowcoder.com/practice/e280b9b5aabd42c9b36831e522485622

思路

 图,队列
构件图,直接从target出发,扩展到第k层就是答案

Java代码

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param root TreeNode类
     * @param target int整型
     * @param k int整型
     * @return int整型一维数组
     */
    public ArrayList  distanceKnodes (TreeNode root, int target, int k) {
        //构建图
        TreeNode cur = root;
        Map<Integer, List<Integer>> graph = new HashMap<>();
        //BFS,二叉树的层序遍历
        Queue<TreeNode> q = new LinkedList<>();
        q.add(cur);
        graph.put(cur.val, new ArrayList<>());
        while (!q.isEmpty()) {
            TreeNode pop = q.poll();

            if (pop.left != null) {
                q.add(pop.left);
                graph.get(pop.val).add(pop.left.val);

                graph.put(pop.left.val, new ArrayList<>());
                graph.get(pop.left.val).add(pop.val);
            }

            if (pop.right != null) {
                q.add(pop.right);
                graph.get(pop.val).add(pop.right.val);
                graph.put(pop.right.val, new ArrayList<>());
                graph.get(pop.right.val).add(pop.val);
            }
        }


       //图的BFS
        Queue<Integer> queue = new LinkedList<>();
        queue.add(target);
        Set<Integer> visited = new HashSet<>();
        visited.add(target);
        while (k >= 0) {
            k--;


            int size = queue.size();
            for (int i = 0; i < size ; i++) {
                int pop = queue.poll();

                for (Integer next : graph.get(pop)) {
                    if (visited.contains(next)) continue;
                    queue.add(next);
                    visited.add(next);
                }
            }


            if ( k == 0) break;
        }


        ArrayList<Integer> ans = new ArrayList <>();
        int size = queue.size();
        for (int i = 0; i < size ; i++) {
           ans.add( queue.poll());
        }
        return ans;
    }
}

Go代码

package main

import . "nc_tools"

/*
 * type TreeNode struct {
 *   Val int
 *   Left *TreeNode
 *   Right *TreeNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param root TreeNode类
 * @param target int整型
 * @param k int整型
 * @return int整型一维数组
 */
func distanceKnodes(root *TreeNode, target int, k int) []int {
	//BFS
	graph := map[int][]int{} //构件图

	//层序遍历二叉树
	q1 := []*TreeNode{}
	q1 = append(q1, root)
	graph[root.Val] = []int{}

	for len(q1) > 0 {
		size := len(q1)
		q1bak := []*TreeNode{}
		for i := 0; i < size; i++ {
			pop := q1[i]
			a := pop.Val
			if pop.Left != nil {
				q1bak = append(q1bak, pop.Left)
				b := pop.Left.Val
				graph[a] = append(graph[a], b)
				graph[b] = []int{a}
			}

			if pop.Right != nil {
				q1bak = append(q1bak, pop.Right)
				c := pop.Right.Val
				graph[a] = append(graph[a], c)
				graph[c] = []int{a}
			}
		}

		q1 = q1bak
	}

	//图的BFS
	q := []int{target}
	visited := map[int]bool{}
	visited[target] = true
	for k >= 0 {
		k--
		size := len(q)
		qbak := []int{}
		for i := 0; i < size; i++ {
			pop := q[i]

			nexts := graph[pop]
			for _, next := range nexts {
				_, ok := visited[next]
				if ok {
					continue
				}

				qbak = append(qbak, next)
				visited[next] = true
			}
		}

		q = qbak
		if k == 0 {
			break
		}
	}

	return q
}

PHP代码

<?php

/*class TreeNode{
    var $val;
    var $left = NULL;
    var $right = NULL;
    function __construct($val){
        $this->val = $val;
    }
}*/

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param root TreeNode类 
 * @param target int整型 
 * @param k int整型 
 * @return int整型一维数组
 */
function distanceKnodes( $root ,  $target ,  $k )
{
      //BFS
    $graph = array(); //构建图
    //二叉树的层序遍历
    $q1 = [$root];
    $graph[$root->val] = array();
    while (count($q1) >0){
        $q1bak=array();
        $size = count($q1);
        for($i=0;$i<$size;$i++){
            $pop = $q1[$i];
            $a = $pop->val;

            if($pop->left!=null){
                $q1bak[count($q1bak)] = $pop->left;
                $b = $pop->left->val;
                $graph[$a][count($graph[$a])] = $b;
                $graph[$b]=[$a];
            }

            if($pop->right!=null){
                $q1bak[count($q1bak)] = $pop->right;
                $c = $pop->right->val;
                $graph[$a][count($graph[$a])] = $c;
                $graph[$c]=[$a];
            }
        }

        $q1=$q1bak;
    }

    //图的BFS
    $q = [$target];
    $visited = [$target=>$target];
    while ($k>=0){
        $k--;
        $size = count($q);
        $qbak = array();

        for($i=0;$i<$size;$i++){
            $nexts = $graph[$q[$i]];

            foreach ($nexts as $next){
                if(isset($visited[$next])) continue;

                $qbak[count($qbak)]  =$next;
                $visited[$next] = $next;
            }
        }
        $q = $qbak;
        if($k ==0) break;
    }

    return $q;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1708734.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙开发接口图形图像:【@ohos.screen (屏幕)】

屏幕 本模块提供管理屏幕的一些基础能力&#xff0c;包括获取屏幕对象&#xff0c;监听屏幕变化&#xff0c;创建和销毁虚拟屏幕等。 说明&#xff1a;开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。…

mysql实战——mysql主从复制管理

一、常见的管理操作 1、查看主库状态 show master status 2、查看从库复制的状态 show slave status 3、在主库上查看从库ip和端口信息 show processlist show slave hosts 4、reset slave、reset master、reset slave all 1、reset master 该命令会执行以下操作&#xff…

openLayers加载wms图层并定位到该图层

openLayers定位到wms图层 我们的wms是加载geoserver发布的服务&#xff0c;wms加载的图层是没法通过layer.getSource().getExtent()来获取到extents&#xff08;边界&#xff09;的&#xff1b;实现思路是通过postgis的函数(st_extent(geom))来获取extents; 返回前端后格式化一…

Spring 对 Junit4,Junit5 的支持上的运用

1. Spring 对 Junit4,Junit5 的支持上的运用 文章目录 1. Spring 对 Junit4,Junit5 的支持上的运用每博一文案2. Spring对Junit4 的支持3. Spring对Junit5的支持4. 总结&#xff1a;5. 最后&#xff1a; 每博一文案 关于理想主义&#xff0c;在知乎上看到一句话&#xff1a;“…

使用js实用工具库lodash做对象的深拷贝

const lodash require(lodash)let obj {user: {name: xutongbao}}let objCopy lodash.cloneDeep(obj)objCopy.user.name xuconsole.log(obj)console.log(objCopy)https://www.lodashjs.com/ 人工智能学习网站 https://chat.xutongbao.top 参考链接&#xff1a; https://…

Unity实现首行缩进两个字符

效果 在Unity中如果想实现首行缩进两个字符&#xff0c;你会发现按空格是没法实现的。 实现原理&#xff1a;用空白的透明的字替代原来的位置。 代码&#xff1a; <color#FFFFFF00>XXX</color> 赶紧去试试吧&#xff01;

速看!!!24上软考系构综合知识真题回忆,考点已更新

2024上半年软考考试已经结束了&#xff0c;为大家整理了网友回忆版的系统架构设计师真题及答案&#xff0c;总共30道题。 上半年考试的宝子们可以对答案预估分数&#xff01;准备下半年考的宝子可以提前把握考试知识点和出题方向&#xff0c;说不定会遇到相同考点的题目&#x…

Talken - 语音命令系统

Talken - 语音命令系统 通过集成最先进的语音命令系统 Talken,释放游戏的全部潜力。 借助 Talken,您可以让玩家通过语音命令控制动作,从而重新定义游戏体验。 观看角色移动并对语音指令做出实时反应,模糊游戏与现实之间的界限。 主要特征: 🗣️ 语音驱动的游戏玩法:…

C++容器之位集(std::bitset)

目录 1 概述2 使用实例3 接口使用3.1 constructor3.2 count_and_size3.3 test3.4 any3.5 none3.6 all3.7 set3.8 reset3.9 filp3.10 to_string3.11 to_ulong3.12 to_ullong3.13 operators1 概述 位集存储位(只有两个可能值的元素:0或1,true或false,…)。   该类模拟bool…

开源与闭源:AI模型发展的两条路径

目录 前言1 数据隐私保护与用户数据安全1.1 开源大模型的透明性与挑战1.2 闭源大模型的控制与责任 2 商业应用的优劣比较2.1 开源大模型的灵活性与创新2.2 闭源大模型的可靠性与服务质量 3 社区参与与合作的差异3.1 开源大模型的社区驱动与协作3.2 闭源大模型的企业主导与保密性…

[nextjs]推荐几个很好看的模板网站

最近在做网站,折腾了 vue 框架,然后发现了 nextjs 框架,感觉这个做出来的网站配色很好看,然后又开始研究这个 网站配色好看是因为用的 tailwindcss,找网站过程中,发现了几个很好看的模板网站,在这里推荐下,或许你也能用得上 推荐第一个网站是: https://tailspark.co/ 有组件,也…

IP协议说明

文章目录 前言一、IP协议的简介二、IP数据报1.IP 数据报结构2.IP 数据报的分片解析3.IP 数据报的分片重装 三、IP 数据报的输出四、IP 数据报的输入 前言 IP 指网际互连协议&#xff0c; Internet Protocol 的缩写&#xff0c;是 TCP/IP 体系中的网络层协议。设计 IP 的目的是…

旺店通与金蝶云星空 就应该这样集成打通

在当今数字化商业环境中&#xff0c;企业需要高效、灵活的系统来支持其业务运营。旺店通和金蝶云星空作为两个领先的企业管理解决方案&#xff0c;它们的集成能够为企业带来无缝的业务流程和数据一致性。本文将详细介绍旺店通与金蝶云星空的全场景集成方案&#xff0c;包括主数…

vue2的方法与监听

vue2的方法 不可以使用箭头函数 <template> <div><div>{{sum2()}}</div><button click"add">add</button> </div></template><script> export default {data(){return{name:"张三",num:20,num2:3…

Py列表(list)

目录 正向索引&#xff1a; 反向索引&#xff1a; 嵌套列表&#xff1a; 修改列表中的值 列表常用的方法 实例 练习&#xff1a; 正向索引&#xff1a; 从0开始&#xff0c;依次递增。第一个元素的索引为0&#xff0c;第二个元素的索引为1&#xff0c;依此类推。 列表的下标…

代码文本编辑器-小白教程(Sublime text, Notepad++ Acode下载安装与使用)

代码文本编辑器-小白教程&#xff08;Sublime text, Notepad Acode下载安装与使用&#xff09; 1. Windows平台和Linux平台1.1 Sublime text1.2 Notepad 2. 安卓平台 Acode参考资料 1. Windows平台和Linux平台 1.1 Sublime text 一、安装教程 1、打开Sublime Text官网下载安…

C# 泛型函数

1.非约束 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace MyGeneirc {public class GeneircMethod{/// <summary>/// 泛型方法解决&#xff0c;一个方法&#xff0c;满足不同参数类型…

08、SpringBoot 源码分析 - 自动配置深度分析一

SpringBoot 源码分析 - 自动配置深度分析一 refresh和自动配置大致流程如何自动配置SpringBootApplication注解EnableAutoConfiguration注解AutoConfigurationImportSelector自动配置导入选择器DeferredImportSelectorHandler的handleDeferredImportSelectorGroupingHandler的r…

NSSCTF | [SWPUCTF 2021 新生赛]no_wakeup

打开题目后&#xff0c;点击三个&#xff1f;&#xff0c;发现是一个php序列化脚本 <?phpheader("Content-type:text/html;charsetutf-8"); error_reporting(0); show_source("class.php");class HaHaHa{public $admin;public $passwd;public function…

互联网应用主流框架整合之数据库事务管理

在互联网系统中同时运行着成千上百个线程是十分常见的事情&#xff0c;尤其当一个热门出现时&#xff0c;用户几乎同时打开手机、电脑、平板灯设备进行访问&#xff0c;这样就会导致数据库处在一个多事务访问的环境中&#xff0c;从而引发数据丢失或者数据不一致的现象&#xf…