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

题目

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

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

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

相关文章

Anthropic公司CEO谈AI发展:Cluade安全超过商业利益

Anthropic公司今年3月发布的超越GPT-4模型Claude3 opus&#xff0c;成功吸引了大量GPT-4用户“叛变”。 作为OpenAI的头号劲敌&#xff0c;Claude3发布方Anthropic公司的联合创始人兼CEO&#xff0c;达里奥阿莫迪&#xff08;DarioAmodei&#xff09;承诺&#xff1a;在能够制…

激光焊接机作为一种高效、精密的焊接设备

激光焊接机是一种用于材料加工时激光焊接的机器&#xff0c;以下是对其的详细介绍&#xff1a; 1. 定义与别称&#xff1a; 激光焊接机&#xff0c;又常称为激光焊机、镭射焊机&#xff0c;是材料加工激光焊接时用的机器。 2. 工作原理&#xff1a; 激光焊接是利用高能量…

【贪心算法题目练习】

1. 分发饼干 这道题目和我们之前讲到的田忌赛马的问题很相似&#xff0c;只不过这这里不需要劣等马去抵消掉优等马&#xff0c;直接上贪心策略&#xff1a; 先将两个数组排序。针对胃口较小的孩子&#xff0c;从小到大挑选饼干: i. 如果当前饼干能满足&#xff0c;直接喂(最小…

【CPP】栈简介及简化模拟实现

CPP栈和队列简单模拟实现 目录 1. 栈的简介2. 栈简化模拟实现3. 栈练习题 1. 栈的简介 栈 是一种 特殊的线性表&#xff0c;具有数据 先进后出 特点。 具体参考&#xff1a;【数据结构】栈 CPP库参考文档&#xff1a;stl_stack 注意&#xff1a; 1.stack本身 不支持迭代器操…

C++之构造函数总结

1、构造函数定义 在C中&#xff0c;构造函数是一种特殊的成员函数&#xff0c;它在创建一个类的对象时自动被调用。构造函数的主要目的是初始化类对象的成员变量&#xff0c;为对象分配资源&#xff0c;以及执行任何其他必要的初始化任务。 构造函数具有以下特点&#xff1a; …

WinApp自动化测试之辅助工具介绍

前篇文章中&#xff0c;我们简单介绍了部分WinApp自动化测试脚本常规操作&#xff0c;今天我们来讲剩余的部分。 文件批量上传 文件批量上传和文件单个上传原理是相同的&#xff0c;单个上传直接传入文件路径即可&#xff0c;批量上传需要进入批量上传的文件所在目录&#xf…

python-双胞胎字符串

[问题描述]&#xff1a;给定两个字符串s和t&#xff0c;每次可以任意交换s的奇数位和偶数位的字符&#xff0c;即奇数位的字符可以与任意其它奇数位的字符交换&#xff0c;偶数位的字符同样也可以与任意偶数位的字符的字符交换&#xff0c;问能否在有限的次数的交换下使s变为t?…

0基础学习Elasticsearch-Quick start

文章目录 1 背景2 前言3 快速部署ES4 快速部署Kibana5 发送请求给ES5.1 打开Kibana控制台5.2 通过REST API发送请求5.3 通过curl发送请求5.4 添加数据5.4.1 添加单个document5.4.2 添加多个document 5.5 搜索数据5.5.1 搜索所有documents5.5.2 match查询 6 总结 1 背景 因电商项…

【算法】模拟算法——外观数组(medium)

题解&#xff1a;模拟算法——外观数组(medium) 目录 1.题目2.题解3.参考代码4.总结 1.题目 题目链接&#xff1a;LINK 2.题解 首先应该理解题意&#xff1a; 就是开始给你一个字符串&#xff0c;然后你对其进行描述。 描述规则是&#xff1a;连续的数字为一组&#xff0c;…

大学生社团活动平台系统基于springboot+vue的社团管理系统java项目sprignboot项目

文章目录 大学生社团活动平台一、项目介绍二、部分功能截图三、部分代码展示四、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 大学生社团活动平台 一、项目介绍 基于springbootvue的前后端分离大学生社团活动平台 系统角色 : 学生、社长、管理员 1、学生…

自学 Java 怎么入门?

关于自学 Java 如何入门这一重要课题&#xff0c;在此为大家进行详细阐述。 在此之前&#xff0c;如果大家有兴趣的话&#xff0c;可以看看我自己精心整理的嵌入式入门资料&#xff0c;这些资料将全部免费送给大家。其中包含了编程教学内容、详细的视频讲解、实用的数据库资料…

Java项目:92 基于SSM的办公管理系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 基于SSM的办公管理系统 1、项目介绍 基于SSM的办公管理系统主要是对于办公用品的申领进行管理&#xff0c;系统分为三种角色&#xff0c;超级管理员、企业 职…

自然语言处理基础知识入门(六) GPT模型详解

GPT 前言一、GPT模型1.1 为什么采用Decoder模块&#xff1f;1.2 为什么不使用Encoder模块&#xff1f; 二、 模型训练2.1 预训练阶段2.2 半监督微调 总结 前言 在之前的章节中&#xff0c;深入探究了预训练ELMo模型的架构与实现原理。通过采用双向LSTM架构在大规模文本数据上进…

C++匿名对象

struct&#xff1a;结构体内默认访问权限&#xff1a;public公共->哪里都能用 class&#xff1a;结构体内默认访问权限&#xff1a;private私有->只能在类里使用 简单版本&#xff1a; class SV { public:SV(int dt 520):_data1(dt){};int R_num(){return _data1;}priv…

易语言本地IP一键切换程序(附带源码)

易语言本地IP一键切换程序 效果图部分源码源码领取下期更新预报 效果图 部分源码 .判断开始 (单选框1.选中 &#xff1d; 真)标签5.标题 &#xff1d; #换行符 &#xff0b; “正在切换IP.”.如果真 (运行 (“netsh interface ip set address ” &#xff0b; #引号 &#xff…

yxc图示“链式前向星”核心操作

【知识点&#xff1a;链式前向星】 ● 大佬 yxc 指出“链式前向星”就是“多单链表”&#xff0c;并基于“头插法”给出了所涉及到的 e[]、ne[]、h[] 等数组的独特解释&#xff0c;更易理解。其中&#xff1a;h[a]&#xff1a;存储单链表表头结点 a 的编号e[idx]&#xff1a;存…

vue-el-steps 使用1(上一步、下一步)

vue代码 <template> <div class"app-container"> <el-steps :active"active" finish-status"success" simple style"margin-top: 20px"> <el-step title"选择分类"></el-step> <el-step t…

Linux实验报告(一)——Linux系统安装与简单配置

目录 一、实验名称&#xff1a; 二、仪器、设备&#xff1a; 三、参考资料&#xff1a; 四、实验目的&#xff1a; 五、实验内容&#xff08;步骤&#xff09;&#xff1a; 六、实验数据&#xff08;程序&#xff09;记录&#xff1a; 七、实验结果分析&#xff1a; 八、…

Keras深度学习框架实战(2):估计模型训练所需的样本量

1、模型训练样本量评估概述 1.1 样本量评估的意义 预估模型需要的样本量对于机器学习项目的成功至关重要&#xff0c;以下是几个主要原因&#xff1a; 防止过拟合与欠拟合&#xff1a; 过拟合&#xff1a;当模型在训练数据上表现极好&#xff0c;但在未见过的测试数据上表现糟…

低代码平台:教育机构数字化转型的技术新引擎

在数字化浪潮汹涌而来的今天&#xff0c;教育行业正迎来前所未有的变革。随着技术的不断进步和教育理念的更新&#xff0c;越来越多的教育机构开始意识到数字化转型的重要性。而在这场转型的浪潮中&#xff0c;低代码平台以其独特的优势&#xff0c;正成为教育机构实现数字化转…