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

题目

在这里插入图片描述
题目链接:
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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

期权方向性交易策略怎么制定?

今天期权懂带你了解期权方向性交易策略怎么制定&#xff1f;国内的期权品种已经多达十几种&#xff0c;其中ETF期权是流量最大的品种&#xff0c;截止今日已经上市了十二种ETF期权。 期权方向性交易策略怎么制定&#xff1f; 期权方向性交易策略主要依赖于投资者对市场未来走势…

Day22:Leetcode:654.最大二叉树 + 617.合并二叉树 + 700.二叉搜索树中的搜索 + 98.验证二叉搜索树

LeetCode&#xff1a;654.最大二叉树 1.思路 解决方案&#xff1a; 单调栈是本题的最优解&#xff0c;这里将单调栈题解本题的一个小视频放在这里 单调栈求解最大二叉树的过程当然这里还有leetcode大佬给的解释&#xff0c;大家可以参考一下&#xff1a; 思路很清晰&#xf…

阻塞、非阻塞、同步与异步IO的区别

IO读取数据的过程 如图所示&#xff0c;进程读取数据的过程主要分为两个步骤 1.内核将数据准备好到内核缓冲区 2.内核将数据拷贝到用户态 在上述这两个过程里&#xff0c;进程首先和内核打交道&#xff0c;之后内核再和硬件&#xff08;如网卡&#xff09;打交道 阻塞IO 如图所…

股民用脚投票 退退退!

倒计时2天&#xff0c;看来今年首只非ST类要退市的股票诞生了。 继上周五封S跌停后&#xff0c;今天正源&#xff08;股份&#xff09;再度被股民用脚投票一字跌停&#xff0c; 这已经连续第18个交易日股价低于1块钱了。 按照退市新规&#xff0c;连续20个交易日股价低于1元是…

Docker(三) 容器管理

1 容器管理概述 Docker 的容器管理可以通过 Docker CLI 命令行工具来完成。Docker 提供了丰富的命令&#xff0c;用于管理容器的创建、启动、停止、删除、暂停、恢复等操作。 以下是一些常用的 Docker 容器命令&#xff1a; 1、docker run&#xff1a;用于创建并启动一个容器。…

拖线无人机技术:像风筝一样飞行,无人能干扰

拖线无人机技术是一种独特且高效的无人机应用技术&#xff0c;其设计理念源于风筝。这种无人机不仅能够在空中稳定飞行&#xff0c;而且具备极强的抗干扰能力&#xff0c;使其在各种复杂环境下都能保持通信畅通和任务执行的高效。 拖线无人机技术的核心在于其拖线系统。与传统的…

springboot实现多开发环境匹配置

首先logbok-spring.xml里面的内容 <?xml version"1.0" encoding"UTF-8"?> <configuration><!-- 开发、测试环境 --><springProfile name"dev,test"><include resource"org/springframework/boot/logging/log…

从 0 开始实现一个博客系统 (SSM 项目)

相关技术 Spring Spring Boot Spring MVC MyBatis Html Css JS pom 文件我就不放出来了, 之前用的 jdk8 做的, MySQL 用的 5.7, 都有点老了, 你们自己看着配版本就好 实现功能 用户注册 - 密码加盐加密 (md5 加密)前后端用户信息存储 - 令牌技术用户登录 - (使用 拦截…

打造高质感的电子画册,这篇文章告诉你

​在数字化时代&#xff0c;电子画册作为一种全新的视觉传达方式&#xff0c;正逐渐成为各行各业展示形象、传播信息的重要工具。相较于传统的纸质画册&#xff0c;电子画册具有更高的质感、更好的互动性以及更低的制作成本&#xff0c;使得它愈发受到众多企业的青睐。那样怎么…

多电压档hold扫尾

MMMC下STA收敛更为困难&#xff0c;setup通过DMSA可以很好的得到收敛&#xff1b;但是常规的时序修复工具很难通过工具得到最终clean的时序状态&#xff0c;本文介绍一种多模多角下hold的收敛方法。 该方法主要通过遍历hold路径上多电压setup的余量&#xff0c;支持从前往后和从…

uniapp 使用vuex 在app上能获取到state,小程序获取不到

1. 在根目录下新建store目录, 在store目录下创建index.js定义状态值import Vue from vue; import Vuex from Vuex; import Vuex from vuex; Vue.use(Vuex);const store new Vuex.Store({ state: { login: false, token: , avatarUrl: , userName: }, mutations: { lo…

HiWoo Box工业网关

在科技飞速发展的今天&#xff0c;工业领域正迎来智能化变革。在这场变革中&#xff0c;工业网关作为连接工业设备与远程控制中心的桥梁&#xff0c;发挥着至关重要的作用。HiWoo Box网关凭借其卓越的性能和广泛的应用场景&#xff0c;为工业领域带来了全新的智慧化解决方案。 …

IP地址SSL证书应用场景以及如何申请?

一&#xff1a;IP地址SSL证书主要应用于以下几种场景&#xff1a; 1.API接口保护&#xff1a;许多云服务和企业内部系统使用IP地址直接作为服务的访问点&#xff0c;特别是在API接口的调用中。IP地址SSL证书可以为这些API接口提供必要的安全加密&#xff0c;确保数据在传输过程…

44、Flink 的 Interval Join 详解

Interval Join Interval join 组合元素的条件为&#xff1a;两个流&#xff08;暂时称为 A 和 B&#xff09;中 key 相同且 B 中元素的 timestamp 处于 A 中元素 timestamp 的一定范围内&#xff0c;即 b.timestamp ∈ [a.timestamp lowerBound; a.timestamp upperBound] 或…

代码随想录算法训练营day21|530.二叉搜索树的最小绝对值差、501.二叉搜索树中的众数、236.二叉树的最近公共祖先

二叉搜索树的最小绝对值差 递归法 首先需考虑这是一个二叉搜索树&#xff0c;在中序遍历后的结果为从小到大的一个序列&#xff0c;寻找二叉搜索树的最小绝对值差&#xff0c;只需比较一个节点与之后的差值即可。在遍历的过程中&#xff0c;我们需要一个节点保存前节点…

[IMX6ULL驱动开发]-Linux对中断的处理(二)

上一篇文章中&#xff0c;引入了Linux对于中断的一些简略流程以及中断抽象为具体实际形象。此文章主要是继续加深对Linux对中断的处理流程以及一些相应的数据结构。 目录 Linux对中断的扩展&#xff1a;硬件中断、软件中断 多中断处理 中断上下部处理流程 发生中断A&#…

Liunx学习随笔

Linux学习随笔 Linux学习随笔一.前期准备1.安装Vmware Workstation软件2.下载linux镜像3.安装操作系统4.配置静态ip5.下载安装远程连接工具 二.语法2.1 linux哲学思想(原则)2.2 小命令 夕阳无限好&#xff0c;只是近黄昏&#xff0c;时隔一年&#xff0c;重新提笔 没有比脚更远…

vue3+arco design通过动态表单方式实现自定义筛选

目录 1.说明 2.示例 3.运行截图 ​编辑 4.总结 1.说明 (1) 本文主要实现通过动态表单的方式实现自定义筛选的功能&#xff0c;用户可以自己添加筛选的项目&#xff0c;筛选条件及筛选内容。 (2) 每个项目的筛选包含筛选项目&#xff0c;筛选条件&#xff0c;筛选方式及筛选…

【算法】位运算算法——只出现一次的数字Ⅱ

题解&#xff1a;只出现一次的数字Ⅱ(位运算算法) 目录 1.题目2.题解&#xff1a;3.代码示例4.总结 1.题目 题目链接&#xff1a;LINK 要求&#xff1a;时间复杂度&#xff1a;O(N)&#xff0c;空间复杂度&#xff1a;O(1) 2.题解&#xff1a; 3.代码示例 class Solution {…

20212313 2023-2024-2 《移动平台开发与实践》第6次作业

20212313 2023-2024-2 《移动平台开发与实践》第6次作业 1.实验内容 设计并开发一个语音识别应用系统。 通过使用RecognizerIntent实现语音识别功能&#xff0c;开发一个Android语音识别系统。 2.实验过程 2.1下载语音识别的SDK 这里我们选择的是科大讯飞的语音识别&#…