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

news2024/10/6 23:40:53

题目

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

C++ 代码

/**
 * struct TreeNode {
 *  int val;
 *  struct TreeNode *left;
 *  struct TreeNode *right;
 *  TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param root TreeNode类
     * @param target int整型
     * @param k int整型
     * @return int整型vector
     */
    vector<int> distanceKnodes(TreeNode* root, int target, int k) {
        //BFS

        //二叉树层序遍历
        vector<TreeNode> q1;
        std::map<int, vector<int>> graph;
        q1.push_back(*root);
        graph[root->val] = vector<int>();


        while (q1.size() > 0) {
            vector<TreeNode> q1bak;
            int size = q1.size();
            for (int i = 0; i < size; i++) {
                TreeNode pop = q1[i];
                int a = pop.val;

                if (pop.left != nullptr) {
                    q1bak.push_back(*pop.left);
                    int b = pop.left->val;
                    graph[a].push_back(b);
                    graph[b] = vector<int>();
                    graph[b].push_back(a);
                }

                if (pop.right != nullptr) {
                    q1bak.push_back(*pop.right);
                    int c = pop.right->val;
                    graph[a].push_back(c);
                    graph[c] = vector<int>();
                    graph[c].push_back(a);
                }
            }
            q1 = q1bak;
        }

        //图的BFS
        vector<int> q = {target};
        std::map<int, bool> visited;
        visited[target] = true;

        while (k >= 0) {
            k--;
            int size = q.size();
            vector<int> qbak;
            for (int i = 0; i < size; i++) {
                vector<int> nexts = graph[q[i]];

                for (int j = 0; j < nexts.size(); j++) {
                    int next = nexts[j];
                    if (visited.count(next) == 0) {
                        visited[next] = true;
                        qbak.push_back(next);
                    }
                }
            }
            q = qbak;
            if (k == 0) break;

        }
        return q;
    }
};

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

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

相关文章

odoo10 权限控制用户只允许看到自己的字段

假设一个小区管理员用户&#xff0c;只想看到自己小区的信息。 首先添加一个用户信息选项卡界面&#xff0c;如下图的 用户 > 隶属信息&#xff1a; 我们在自己创建的user模块中&#xff0c;views文件夹下添加base_user.xml <?xml version"1.0" encoding&q…

8. C#多线程基础概念

文章目录 一. 目标二. 技能介绍① 进程和线程② 为什么需要多线程③ C#实现多线程的方式④ 线程的操作(创建_终止_挂起_恢复) 一. 目标 进程和线程基本概念为什么需要多线程?C#实现多线程的方式?线程Thread的创建,终止,挂起和恢复? 二. 技能介绍 ① 进程和线程 什么是进程…

中信证券:A股下半年将迎来年度级别上涨行情的起点

中信证券认为&#xff0c; 过去3年压制A股表现的经济动能转换&#xff0c;资本市场生态&#xff0c;中美战略博弈这三大叙事都将迎来重大拐点&#xff0c;随着政策、价格、外部三类信号逐步验证&#xff0c;2024年下半年A股市场将迎来年度级别上涨行情的起点 过去3年压制A股表…

Flutter 验证码输入框

前言&#xff1a; 验证码输入框很常见&#xff1a;处理不好 bug也会比较多 想实现方法很多&#xff0c;这里列举一种完美方式&#xff0c;完美兼容 软键盘粘贴方式 效果如下&#xff1a; 之前使用 uniapp 的方式实现过一次 两种方式&#xff08;原理相同&#xff09;&#xff1…

GLM-4-9B性能究竟如何?

GLM-4-9B 开源系列模型 前言 自 2023 年 3 月 14 日 ChatGLM-6B 开源以来&#xff0c;GLM 系列模型受到广泛认可。特别是在 ChatGLM3-6B 开源后&#xff0c;针对让小模型能够拥有更为强大的能力这一目标&#xff0c;GLM 技术团队展开了诸多的探索性工作。历经将近半年的探索历程…

为什么要做与运算?网关如何和ip做与运算?

在计算机网络中&#xff0c;“与运算”是一个基本而重要的概念&#xff0c;尤其在IP地址和子网掩码的处理中起着关键作用。本文将解释为什么要进行与运算&#xff0c;以及网关如何和IP地址进行与运算。 为什么要做与运算&#xff1f; 1. 确定网络地址 与运算&#xff08;AND…

PhpSpreadsheet表格导出

个人笔记记录 使用PhpSpreadsheet 导出excel。 多重表头生成excel 表 //读取数据库public function demo1(){// 连接数据库$config Config::get(databaseedc);$db Db::connect($config);$data $db->name("xxxx")->alias(a)->field(main_header, sub_hea…

在 Win系统安装 Ubuntu20.04子系统 WSL2 (默认是C盘,第7步开始迁移到D盘,也可以不迁移)

1、简介 WSL在Windows 10上原生运行Linux二进制可执行文件&#xff0c;不用单独安装虚拟机。 WSL2是WSL的第二个版本&#xff0c;提供了与WSL相比的显著性能改进和完全的系统呼叫兼容性。通过运行Linux内核在一个轻量级虚拟机&#xff08;VM&#xff09;中实现。 2、安装 电…

SAP PP学习笔记14 - MTS(Make-to-Stock) 按库存生产(策略10),以及生产计划的概要

上面讲了SAP里面的基础知识&#xff0c;BOM&#xff0c;作业手顺&#xff08;工艺路线&#xff09;&#xff0c;作业区&#xff08;工作中心&#xff09;&#xff0c;MRP&#xff0c;MPS等概念&#xff0c;现在该到用的时候了。 SAP PP学习笔记07 - 简单BOM&#xff0c;派生BO…

将单列数据帧转换成多列数据帧

文章目录 1. 查看数据文件2. 读取数据文件得到单例数据帧3. 将单列数据帧转换成多列数据帧 在本次实战中&#xff0c;我们的目标是将存储在HDFS上的以逗号分隔的文本文件student.txt转换为结构化的Spark DataFrame。首先&#xff0c;使用spark.read.text读取文件&#xff0c;得…

金融行业数字化上云及信创改造过程中的一些问题及解决方案|合集①

Q&#xff1a;对金融机构来讲&#xff0c;什么是一切业务运行的前提&#xff1f; 金融机构的业务连续性对系统的稳定性要求极高。任何系统故障都可能导致严重的业务中断和经济损失。因此&#xff0c;金融机构需要IT基础架构能够提供高稳定性的服务&#xff0c;确保业务的连续运…

[沫忘录]MySQL InnoDB引擎

[沫忘录]MySQL InnoDB引擎 逻辑存储结构 InnoDB采用 “表、段&#xff0c;区&#xff0c; 页、行” 这样的层级结构进行存储。 **表空间(tablespace)**ibd文件&#xff0c;主要用于存储记录、索引等数据&#xff0c;一个mysql实例可有多个表空间&#xff0c;甚至能通过innodb…

.NET周刊【6月第1期 2024-06-02】

国内文章 一文带你了解.NET能做什么&#xff1f; https://www.cnblogs.com/Can-daydayup/p/18214473 .NET是一个免费、开源、跨平台的开发平台框架&#xff0c;广泛应用于桌面、Web、移动、云服务、游戏、物联网、大数据和人工智能等领域开发。它支持C#、Visual Basic、F#等…

SSL代码签名最佳实践

代码签名就是软件发布者使用全球可信的证书颁发机构CA颁发的代码签名证书对软件代码进行签名&#xff0c;由此来验证软件开发者的真实身份&#xff0c;确保软件代码的完整性和可信任性。然而&#xff0c;攻击者一直试图渗透代码签名&#xff0c;意将恶意软件嵌入可信代码中。由…

finalshell刚连上就断,这个参数你注意到了吗

在实际应用中可能一不下心弄错一个参数就会让你的finalshell刚连上就断&#xff0c;如下图所示。 1、进入ssh目录下&#xff0c;修改ssh_config文件 2、修改UseDNS no,并把前面的#去掉。 注&#xff1a;如果在ssh_config文件见不到UseDNS yes ,可以打开sshd_config,他们是在…

视频怎么压缩变小?推荐三个压缩方法

视频怎么压缩变小&#xff1f;在数字时代&#xff0c;视频已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;随着视频质量的提升&#xff0c;视频文件的大小也随之增加&#xff0c;这给存储和分享带来了不小的挑战。幸运的是&#xff0c;市面上有许多视频压缩软件…

Java学习笔记 集合的使用

在实际的项目中开发过程中&#xff0c;会有很多的对象&#xff0c;如何高效、方便的管理这些对象&#xff0c;是影响程序性能与可维护性的重要环节。在Java语言中为这个问题提供了一套完美的解决方案&#xff0c;也就是接下来要介绍的集合框架。 1.1 集合框架的结构 从Collect…

什么是 Batch Normalization 批标准化和全连接层

Batch Normalization 神经元在经过激活函数之后会处于饱和状态&#xff0c;无论后续怎么变化都不会再起作用。 每一层都会进行batch normalization的处理&#xff01; without normalization 会导致数据分布再饱和区 全连接层&#xff1a; 全连接层(fully connected layers&a…

DPDK基础组件一(mbuf、ring、pktmbuf_pool)

一、rte_mbuf 此部分转自:https://zhuanlan.zhihu.com/p/616314276 1.mbuf结构 mbuf是报文中的描素的结构体,是整个转发过程中最核心的数据结构之一。主要针对于mbuf的常用API与基本原理做一个简单的介绍。 mbuf:报文内存存储结构,存储在mempool中mempool:使用环形缓冲…

【kubernetes】k8s集群中的ingress(对外服务)规则详解

目录 一、Ingress 简介 1.1service的作用 1.2外部访问方案 (四种&#xff09;&#x1f339;&#x1f339;&#x1f339; 部署externalIPs 1.3Ingress 是什么 二、Ingress 组成&#x1f339;&#x1f339;&#x1f339; 三、Ingress 工作原理&#x1f431;&#x1f…