二叉树-距离是K的二叉树节点(hard)

news2024/11/24 17:07:54

目录

一、问题描述

二、解题思路

1.总体思路(DFS+BFS结合)

2.下面举具体例子来对思路进行解释

(1)返回值在一侧的情况

(2)返回值在两侧的情况

三、代码实现

四、刷题链接


一、问题描述

二、解题思路

1.总体思路(DFS+BFS结合)

        使用深度遍历DFS算法获得目标结点所在路径(不包含目标结点和根节点),保存在ArrayList中,同时我们可以根据下标可以知道祖先结点距离目标结点的距离(dis),根据这个差值(k-dis),我们就可以使用广度优先遍历(层序遍历BFS算法)来求祖先节点的第(k-dis)层的子孙结点

2.下面举具体例子来对思路进行解释

返回值结点可能在根节点单侧或双侧的情况

(1)返回值在一侧的情况

再来看一个例子target=1,k=2时:

(2)返回值在两侧的情况

画红色框框的是需要比较的几个关键结点。

三、代码实现

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 {
    int depth=0;
    TreeNode resNode=new TreeNode(-1);
    HashSet<Integer> findSet=new HashSet<>();
    ArrayList<Integer> arr = new ArrayList<>();
    ArrayList<TreeNode> nodes=new ArrayList<>();
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @param target int整型 
     * @param k int整型 
     * @return int整型一维数组
     */
    public ArrayList<Integer> distanceKnodes (TreeNode root, int target, int k) {
        boolean isSide=false;
        boolean isleft=false;
        if(k==0){
            arr.add(target);
            return arr;
        }
        if(root.val==target){//直接执行bfs即可
            bfs(root.left,k-1);
            bfs(root.right,k-1);
            return arr;
        }
        // 先检查是否在左侧
        dfs(root.left,target,1);
        if(depth!=0){
            isleft=true;
        }else{
            dfs(root.right,target,1);
        }
        if(depth<k){
            isSide=false;
        }else{
            isSide=true;
        }

        if(isSide){//结果都在根节点一侧
            //遍历target子孙结点
            bfs(resNode,k);

            //如果是根节点
            if(k==nodes.size()+1){
                arr.add(root.val);
            }
            for(int i=0;i<nodes.size();i++){
                if(k==i+1){//如果祖先结点路径上存在距离为k的节点,也要返回
                    arr.add(nodes.get(i).val);
                }
                //祖先结点的孩子结点存在距离为k的结点返回(注意避开目标结点所在路径)
                if(nodes.get(i).left!=null&&!findSet.contains(nodes.get(i).left.val)){
                    bfs(nodes.get(i).left,k-i-1-1);
                }
                if(nodes.get(i).right!=null&&!findSet.contains(nodes.get(i).right.val)){
                    bfs(nodes.get(i).right,k-i-1-1);
                }
            }
        }else{//结果分散在根节点两侧
            int diff=k-depth;
            if(isleft){
                //遍历右侧深度为diff-1的结点
                bfs(root.right,diff-1);
            }else{
                //遍历右侧深度为diff-1的结点
                bfs(root.left,diff-1);
            }
            //遍历target子孙结点
            bfs(resNode,k);

            //遍历祖先节点
            for(int i=0;i<nodes.size();i++){
                if(nodes.get(i).left!=null&&!findSet.contains(nodes.get(i).left.val)){
                    bfs(nodes.get(i).left,k-i-1-1);
                }
                if(nodes.get(i).right!=null&&!findSet.contains(nodes.get(i).right.val)){
                    bfs(nodes.get(i).right,k-i-1-1);
                }
                
            }
        }
        
        return arr; 
    }
    //遍历第depth层的结点
    public void bfs(TreeNode root,int depth){
        if(root==null){
            return;
        }
        int layernum=0;//深度是从0开始的
        Queue<TreeNode> nowqueue=new LinkedList<>();
        nowqueue.offer(root);
        int nowlayerNodenum=1;//当前层的剩余结点数量
        int nextlayerNodenum=0;//下一层的结点数量
        while(!nowqueue.isEmpty()){
            TreeNode nownode=nowqueue.poll();
            if(layernum==depth){
                arr.add(nownode.val);
            }
            nowlayerNodenum--;
            
            if(nownode.left!=null){
                nowqueue.offer(nownode.left);
                nextlayerNodenum++;
            }
            if(nownode.right!=null){
                nowqueue.offer(nownode.right);
                nextlayerNodenum++;
            }

            if(nowlayerNodenum==0){
                nowlayerNodenum=nextlayerNodenum;
                layernum++;//开启下一层的遍历操作
                nextlayerNodenum=0;
                if(layernum>depth){
                    break;
                }
            }
        }
    }
    public boolean dfs(TreeNode root,int target,int nowdepth){
        if(root==null){
            return false;
        }
        if(root.val==target){
            depth=nowdepth;
            resNode=root;
            findSet.add(root.val);
            return true;
        }else{
            boolean leftbool=dfs(root.left,target,nowdepth+1);
            boolean rightbool=dfs(root.right,target,nowdepth+1);
            if(leftbool||rightbool){
                nodes.add(root);
                findSet.add(root.val);
                return true;
            }else{
                return false;
            }
        }
    }
}

四、刷题链接

距离是K的二叉树节点_牛客题霸_牛客网

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

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

相关文章

【2024亲测无坑】Oracle--19C在Centos7上的静默安装(rpm版)

一、Oracle 19c Linux安装&#xff08;Centos 7&#xff09; 1.查看磁盘可用空间及配置ip地址 [rootlocalhost /]# df -h 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 1.4G 0 1.4G 0% /dev tmpfs 1.4G …

Docker-Portainer可视化管理工具

Docker-Portainer可视化管理工具 文章目录 Docker-Portainer可视化管理工具介绍资源列表基础环境一、安装Docker二、配置Docker加速器三、拉取Portainer汉化版本镜像四、运行容器五、访问可视化界面 介绍 Portainer是一款开源的容器管理平台&#xff0c;它提供了一个直观易用的…

Nature|高性能柔性纤维电池 (柔性智能织物/可穿戴电子/界面调控/柔性电池/柔性电子)

2024年4月24日,复旦大学彭慧胜(Huisheng Peng)院士团队,在《Nature》上发布了一篇题为“High-performance fibre battery with polymer gel electrolyte”的论文,陆晨昊(Chenhao Lu)、Haibo Jiang和Xiangran Cheng为论文共同第一作者。论文内容如下: 一、 摘要 用聚合物凝…

基于Spring Boot的智能分析平台

项目介绍&#xff1a; 智能分析平台实现了用户导入需要分析的原始数据集后&#xff0c;利用AI自动生成可视化图表和分析结论&#xff0c;改善了传统BI系统需要用户具备相关数据分析技能的问题。该项目使用到的技术是SSMSpring Boot、redis、rabbitMq、mysql等。在项目中&#…

AMD平台,5600X+6650XT,虚拟机安装macOS 14(2024年6月)

AMD平台安装macOS 14的麻烦&#xff0c;要比Intel平台多的多&#xff0c;由于macOS从13开始&#xff0c;对CPU寄存器的读取进行了改变&#xff0c;导致AMD平台只要安装完macOS 13及以后版本&#xff0c;开机后就报五国语言错误&#xff0c;不断重启。改vmx文件&#xff0c;被证…

基于springboot的学生宿舍管理系统(带 1w+字文档)

基于springboot的学生宿舍管理系统(带 1w字文档) 基于 springbootvue 前后端分离的学生宿舍管理系统&#xff1a;前端 vue2、elementui&#xff0c;后端 maven、springmvc、spring、mybatis&#xff1b; 项目简介 本项目可供学习参考&#xff0c;商业慎用。项目带完整安装部署…

Python基础教程(二十二):XML解析

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

微服务架构思考

时间&#xff1a;2024年06月16日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 音频地址&#xff1a; https://xima.tv/1_HvQZkj?_sonic0https://xima.tv/1_HvQZkj?_sonic0 大家好&#xff0c;欢迎来到小蒋聊技术&#xff0c…

Vue - 实现登录页面

1、技术框架 1、技术框架Vue-Cli Vue3.0 2、界面推荐大小&#xff1a; 1920 * 1080 3、UI组件&#xff1a;elementui 4、icon: element-plus/icons-vue 5、node版本&#xff1a;v20.14.0 2、效果图 3、源代码部分截图 4、其他 有需要的请联系作者。需要购买&#xff0c;不白…

ABBYY Finereader 15软件安装包下载

软件简介&#xff1a; FineReader PDF提供实用、简易的工具&#xff0c;将纸质文档和PDF结合起来&#xff0c;提高了数字工作场所的效率。 FineReader 15最大特色是采用了ABBYY最新推出的基于AI的OCR技术&#xff0c;可以更轻松地在同一工作流程中 对各种文档进行数字化、检索…

明日周刊-第13期

在这期间发生了很多的事&#xff0c;导致拖更了一周。接下去努力不断更&#xff0c;哈哈哈希望如此。配图是最近上映的一部电影《狗阵》的海报&#xff0c;看完之后感悟颇深&#xff0c;希望大家都能去电影院感受一下。 文章目录 一周热点资源分享言论歌曲推荐 一周热点 最近一…

跨语言翻译的突破:使用强化学习与人类反馈提升机器翻译质量

在人工智能领域&#xff0c;知识问答系统的性能优化一直是研究者们关注的焦点。现有的系统通常面临知识更新频繁、检索成本高、以及用户提问多样性等挑战。尽管采用了如RAG&#xff08;Retrieval-Augmented Generation&#xff09;和微调等技术&#xff0c;但它们各有利弊&…

类Copy方法:BeanUtils.copyProperties

类Copy方法&#xff1a;BeanUtils.copyProperties 需求场景 比如有时候我们想要把数据库里面的数据导出到excel表中&#xff0c;比如想要把数据库中的用户数据导出到excel表格中&#xff1b; 假设我们程序代码中与数据库对接的实体类是User&#xff0c;用于展示到前端的实体类…

aarch64系统中给qt编译的可执行程序加上图标

在qt中编译的可执行程序图标是默认是一种格式 而且无法替换改图标&#xff0c;看起来不够美观&#xff0c;可以使用.desktop的链接文件来链接编译的执行程序&#xff0c;通过点击.desktop图标来去运行可执行程序。 实现步骤&#xff1a; 创建一个以.desktop结尾的文件并记得给…

Es 索引查询排序分析

文章目录 概要一、Es数据存储1.1、_source1.2、stored fields 二、Doc values2.1、FieldCache2.2、DocValues 三、Fielddata四、Index sorting五、小结六、参考 概要 倒排索引 优势在于快速的查找到包含特定关键词的所有文档&#xff0c;但是排序&#xff0c;过滤、聚合等操作…

室内定位技术解析:蓝牙信标在室内导航中的应用

室内定位技术&#xff0c;作为现代导航领域的重要突破&#xff0c;解决了GPS在室内空间定位的局限&#xff0c;为我们提供了一种全新的空间认知和利用方式。本文将以蓝牙技术为例&#xff0c;深入解析室内定位的工作原理、关键技术和系统构成&#xff0c;以及在现代导航中的应用…

库的制作 与 使用 (Linux下)

目录 动静态库的制作 前置知识 库的基本构造 问题 分析 要给什么文件 如何更好的让别人使用 库的生成 静态库的生成 makefile参考 动态库的生成 makefile参考&#xff08;包含动态库和静态库生成&#xff09; 库的使用 法一&#xff1a;放入系统路径 弊端 法二…

【MATLAB】语法

MATLAB 基本语法(%{和%}) 赋值 函数名值&#xff1b;for for i1:10循环语句 end//while x0; sum0; while x<100sumsumx;x; end//if if x > 1f x^2 1; elsef 2 * x endswitch onum input(请输入一个数); switch num case -1 //注意case后面没有冒号disp(I am…

[Linux] TCP协议介绍(3): TCP协议的“四次挥手“过程、状态分析...

TCP协议是面向连接的 上一篇文章简单分析了TCP通信非常重要的建立连接的"三次握手"的过程 本篇文章来分析TCP通信中同样非常重要的断开连接的"四次挥手"的过程 TCP的"四次挥手" TCP协议建立连接 需要"三次握手". "三次挥手&q…

英伟达开源最强通用模型Nemotron-4 340B

英伟达的通用大模型 Nemotron&#xff0c;开源了最新的 3400 亿参数版本。 本周五&#xff0c;英伟达宣布推出 Nemotron-4 340B。它包含一系列开放模型&#xff0c;开发人员可以使用这些模型生成合成数据&#xff0c;用于训练大语言模型&#xff08;LLM&#xff09;&#xff0…