面试热题100(二叉树的右视图)

       给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

 树这类问题用的最多的就是递归,因为树具有天然的递归结构:

        我们来分析一下题目,给定一棵树根结点,求出每层的最右边的结点,是不是我们可以换个角度想,是不是相当于求树每层的最右边的结点,将一整棵树分成一层一层的进行看待,这是不是与我们学过的树的层序遍历有关,来我们开始写代码:

       因为我们既要关注结点的值,还要关注结点的所在的层数,一般碰到我们需要关注的该物体的属性在2个或者2个以上时,这时候我们就需要手动的去创建一个Piar对,对其进行封装

    public class pair{private TreeNode node;private Integer level;public pair(TreeNode node,Integer level){this.level=level;this.node=node;}}

 树的层序遍历是通过BFS实现的,实现的数据结构肯定不能少

Queue<pair> queue=new LinkedList<>();

 因为我们需要返回一个List<Integer>,题目让返回什么,我们就先给它创建什么

        List<List<Integer>> list=new ArrayList<>();List<Integer> path=new ArrayList<>();

 然后就开始套用BFS模板进行解答

        queue.add(start);while(!queue.isEmpty()){int val=queue.poll();...if(node.left!=null){queue.add(...);}if(node.right!=null){queue.add(...);}

       通过BFS遍历之后,我们就会得到一个类似于这样的存储结点的链表,是不是我们所需要的是每个链表中的最后一个元素,我们将每个小链表拿出来,将每个中最后一个元素取出放到一个新的链表中,那么这个新的链表不就是我们想要求的最终列表链表么?

  List<Integer> result=new ArrayList<>(list.size());for (List<Integer> item:list) {result.add(item.get(item.size()-1));}

第一种方法的源码:

 public List<Integer> rightSideView(TreeNode root) {List<List<Integer>> list=new ArrayList<>();List<Integer> path=new ArrayList<>();if(root==null){return path;}Queue<pair> queue=new LinkedList<>();queue.add(new pair(root,0));while(!queue.isEmpty()){pair pair=queue.poll();TreeNode node=pair.node;Integer level=pair.level;if(list.size()==level){list.add(new ArrayList<>());}List<Integer> list2=list.get(level);list2.add(node.val);if(node.left!=null){queue.add(new pair(node.left,level+1));}if(node.right!=null){queue.add(new pair(node.right,level+1));}}List<Integer> result=new ArrayList<>(list.size());for (List<Integer> item:list) {result.add(item.get(item.size()-1));}return result;}public class pair{private TreeNode node;private Integer level;public pair(TreeNode node,Integer level){this.level=level;this.node=node;}}

 这样一来我们这道题的解决完了,下面给大家提供一种新的思路(递归)

       因为树是天然的递归结构,每层的最右边的结点是不是一般在某棵数的右子树(存在的时候)中,所以我们可以先递归右子树、后递归左子树

        DG(root.right);DG(root.left);

        我们怎么才能获得最右边的节点呢?这样是不是和我们刚才讲的思路相差不多,树的高度,我们可以在递归的时候将树的高度当做参数传下去,然后我们就可以写成:

    private void DG(TreeNode root, int depth) {DG(root.right,depth+1);DG(root.left,depth+1);}

 递归的两要素:递归结束条件+递归操作

那么是不是当我们这个结点为空时,直接return出去就好了

  if(root==null){return;}

我们还应该声明一个容器去存储我们得到的结果,直接看源代码:

 List<Integer> list=new ArrayList<>();public List<Integer> rightSideView(TreeNode root) {if(root==null){return list;}DG(root,0);return list;}private void DG(TreeNode root, int depth) {if(root==null){return;}if(depth==list.size()){list.add(root.val);}DG(root.right,depth+1);DG(root.left,depth+1);}

       这里一定有人回问?这里为什么是当depth==list.size()的时候,会将这个结点加入list中去,这种问题对于读递归不是很熟的东西确实是比较难以捉摸的,原因是这样的,因为我们在递归的时候是优先递归的是右子树,后递归的左子树,所以每次都是每层的最右边的那个节点优先到达的这层,所以才往我们的结果集中加入当前节点,所以才会这么写

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue拖拽改变宽度

1.封装组件ResizeBox.vue <template><div ref"resize" class"resize"><div ref"resizeHandle" class"handle-resize" /><slot /></div> </template> <script> export default {name: Resi…

Python入门自学进阶-Web框架——38、redis、rabbitmq、git

缓存数据库redis&#xff1a; NoSQL&#xff08;Not only SQL&#xff09;泛指非关系型的数据库。为了解决大规模数据集合多重数据类的挑战。 NoSQL数据库的四大分类&#xff1a; 键值&#xff08;Key-Value&#xff09;存储数据库列存储数据库文档型数据库图形&#xff08;…

Spring学习笔记之spring概述

文章目录 Spring介绍Spring8大模块Spring特点 Spring介绍 Spring是一个轻量级的控制反转和面向切面的容器框架 Spring最初的出现是为了解决EJB臃肿的设计&#xff0c;以及难以测试等问题。 Spring为了简化开发而生&#xff0c;让程序员只需关注核心业务的实现&#xff0c;尽…

【暑期每日一练】 day14

目录 选择题 &#xff08;1&#xff09; 解析&#xff1a; &#xff08;2&#xff09; 解析&#xff1a; &#xff08;3&#xff09; 解析&#xff1a; &#xff08;4&#xff09; 解析&#xff1a; &#xff08;5&#xff09; 解析&#xff1a; 编程题 题一 …

品牌活动 | 阿里云云原生技术实践营:大模型+CloudOS,实现企业智能化

近日&#xff0c;由阿里云举办的“云原生技术实践营-应用和容器实践专场”在广州顺利开展。行云创新CEO马洪喜作为受邀嘉宾之一&#xff0c;参加了本次活动&#xff0c;分享了主题为“API大语言模型&#xff0c;以非侵入式实现企业业务智能化变革”的演讲&#xff0c;向参会者展…

Java正则校验密码至少包含:字母数字特殊符号中的2种

一、语法 字符说明\将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如&#xff0c; n匹配字符 n。\n 匹配换行符。序列 \\\\ 匹配 \\ &#xff0c;\\( 匹配 (。^匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性&#xff0c;^ 还会与"\n…

【计算机网络】网络层协议 -- ICMP协议

文章目录 1. ICMP协议简介2. ICMP协议格式3. ping命令4. ping命令与端口号没有关系&#xff01;&#xff01;&#xff01;5. traceroute命令 1. ICMP协议简介 ICMP&#xff08;Internet Control Message Protocol&#xff0c;控制报文协议&#xff09;&#xff0c;用于在IP主机…

web前端转正工作总结范文5篇

web前端转正工作总结&#xff08;篇1&#xff09; 来到__有限公司已经三个月了&#xff0c;目前的工作是前端开发&#xff0c;我是一名应届毕业生&#xff0c;之前没有过工作经验&#xff0c;在刚来到__这个大家庭的时候&#xff0c;我就被这里的工作气氛深深地吸引&#xff0…

C# Onnx Paddle模型 OCR识别

RapidOCR https://github.com/RapidAI/RapidOCR/blob/main/docs/README_zh.md 效果 项目 Demo&#xff08;带模型&#xff09;下载

【积水成渊】CSS磨砂玻璃效果和渐变主题色文字

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 lqj_本人_python人工智能视觉&#xff08;opencv&#xff09;从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了&#xff1a; https://blog.csdn.net/lbcyllqj/category_12346639.html?spm1…

考研408 | 【计算机网络】概述

计算机网络体系结构 计算机网络概述&#xff1a;1.概念&#xff0c;组成&#xff0c;功能&#xff0c;分类2.标准化工作及相关组织3.性能指标体系结构&参考模型&#xff1a;1.分层结构2.协议&#xff0c;接口&#xff0c;服务3.ISO/OSI模型4.TCP/IP模型 目录 计算机网络体…

AI深度学习部署全记录

AI部署流程&#xff0c;以PyTorch为例&#xff1a; 1.Torch.Model->ONNX->ONNXSIM->TensortRT->落地 2.Torch.Model->Pt->ONNX->ONNXRunTime->落地 3.Torch.Model->Pt->Libtorch->落地 4.Torch.Model->PNNX->TensorRT->落地 5.…

图解系列 DNS查找过程和DNS缓存

DNS 充当地址簿。它将人类可读的域名 (google.com) 转换为机器可读的 IP 地址 (142.251.46.238)。 开局一张图 来自&#xff1a;https://xiaolishen.medium.com/the-dns-lookup-journey-240e9a5d345c 寻址流程 查询浏览器缓存&#xff1a;当你输入一个域名后&#xff0c;浏览…

BPMNJS插件使用及汉化(Activiti绘制流程图插件)

BPMNJS插件运行最重要的就是需要安装nodejs插件,这不一定要安装和测试好。 主要是使用npm命令 1、配置BPMNJS插件绘制activiti7工作流 1.1、安装和配置nodejs 插件 1.1.1、下载nodejs 下载地址:https://nodejs.org/en 1.1.2、安装nodejs,傻瓜式安装 安装之后在安装…

一文详解 requests 库中 json 参数和 data 参数的用法

在requests库当中&#xff0c;requests请求方法&#xff0c;当发送post/put/delete等带有请求体的请求时&#xff0c;有json和data2个参数可选。 众所周知&#xff0c;http请求的请求体格式主要有以下4种&#xff1a; application/json applicaiton/x-www-from-urlencoded …

【设计模式——学习笔记】23种设计模式——观察者模式Observer(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入原始方案实现实现问题分析 介绍基础介绍登场角色 案例实现案例一类图实现分析 案例二类图实现 观察者模式在JDK源码的应用总结文章说明 案例引入 有一个天气预报项目&#xff0c;需求如下&#xff1a; 气象站可以将每天测量到的温度、湿度、气压等等以公告的…

性能分析记录

4实例压测TPS浮动在200-300 1.TPS浮动200-300&#xff0c;ART浮动的可能性是10-20ms&#xff0c;链路复杂是可接受的&#xff0c;链路简单则需要分析原因。 1&#xff09;缓存没命中&#xff0c;对某些账号缓存没命中&#xff0c;或缓存失效后导致隔段时间耗时升高。 2&…

SSM(Vue3+ElementPlus+Axios+SSM前后端分离)【三】

文章目录 SSM(Vue3ElementPlusAxiosSSM前后端分离)--基础环境搭建【三】项目介绍项目功能/界面● SSM 整合项目界面 配置Spring 和MyBatis , 并完成整合 SSM(Vue3ElementPlusAxiosSSM前后端分离)–基础环境搭建【三】 项目介绍 项目功能/界面 ● SSM 整合项目界面 配置Sprin…

Mr. Cappuccino的第57杯咖啡——简单手写Mybatis大致原理

简单手写Mybatis大致原理 大致原理项目结构项目代码代码测试 大致原理 底层基于JDK动态代理技术实现 项目结构 项目代码 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns…

fetch-github-hosts间隔一年大更新v2.6发布,多端支持

前言 fetch-github-hosts是一款同步 github hosts 的工具&#xff0c;用于帮助您解决github时而无法访问的问题。在间隔了一年之久的时间&#xff0c;最近抽空将fetch-github-hosts的依赖及UI进行了一波大更新&#xff0c;同时也增加了一些实用的功能。 主要更新 更新了基础依…