【代码随想录刷题】Day18 二叉树05

在这里插入图片描述

文章目录

  • 1.【513】找树左下角的值
    • 1.1题目描述
    • 1.2 解题思路
      • 1.2.1 迭代法思路
      • 1.2.2 递归法思路
    • 1.3 java代码实现
      • 1.3.1 迭代法java代码实现
      • 1.3.2 递归法java代码实现
  • 2. 【112】路径总和
    • 2.1题目描述
    • 2.2 解题思路
    • 2.3 java代码实现
  • 3.【106】从中序与后序遍历序列构造二叉树
    • 3.1题目描述
    • 3.2 解题思路
    • 3.3 java代码实现

【513】找树左下角的值
【112】路径总和
【106】从中序与后序遍历序列构造二叉树

1.【513】找树左下角的值

1.1题目描述

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。
在这里插入图片描述
提示:

  • 二叉树的节点个数的范围是 [1,104]
  • -231 <= Node.val <= 231 - 1

1.2 解题思路

1.2.1 迭代法思路

本题要找出树的最后一行的最左边的值,使用层序遍历是非常简单的,只需要记录最后一行第一个节点的数值就可以了。

1.2.2 递归法思路

题目:在树的最后一行找到最左边的值

首先要是最后一行,然后是最左边的值。

如果使用递归法,如何判断是最后一行呢?其实就是深度最大的叶子节点一定是最后一行。所以要找深度最大的叶子节点。

那么如何找最左边的呢?可以使用前序遍历(当然中序,后序都可以,因为本题没有 根节点的处理逻辑,只要左优先就行),保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。

递归三部曲

    1. 确定递归函数的参数和返回值

参数必须有要遍历的树的根节点,还有就是一个int型的变量用来记录最长深度。 这里就不需要返回值了,所以递归函数的返回类型为void。

本题还需要类里的两个全局变量,maxDepth用来记录最大深度,result记录最大深度最左节点的数值。

	int result;// 全局变量 记录最大深度int maxDepth=-1;// 全局变量 最大深度最左节点的数值public void traversal(TreeNode root,int depth)
    1. 确定终止条件

当遇到叶子节点的时候,就需要统计一下最大的深度了,所以需要遇到叶子节点来更新最大深度。

		if (root.left==null && root.right==null){if (depth>maxDepth){maxDepth=depth;// 更新最大深度result=root.val;// 最大深度最左面的数值}return;}
    1. 确定单层递归的逻辑

在找最大深度的时候,递归的过程中依然要使用回溯

		if (root.left!=null){//左depth++;traversal(root.left,depth);//回溯depth--;}if (root.right!=null){//右depth++;traversal(root.right,depth);//回溯depth--;}return;

1.3 java代码实现

1.3.1 迭代法java代码实现

class Solution {public int findBottomLeftValue(TreeNode root) {//迭代法  层次遍历Queue<TreeNode> que=new LinkedList<>();que.offer(root);int res=0;while (!que.isEmpty()){int len=que.size();for (int i = 0; i < len; i++) {TreeNode tempNode=que.poll();// 记录最后一行第一个元素if (i==0){res=tempNode.val;}if (tempNode.left!=null){que.offer(tempNode.left);}if (tempNode.right!=null){que.offer(tempNode.right);}}}return res;}
}

1.3.2 递归法java代码实现

class Solution {int result;// 全局变量 记录最大深度int maxDepth=-1;// 全局变量 最大深度最左节点的数值public int findBottomLeftValue(TreeNode root) {//递归traversal(root,0);return result;}public void traversal(TreeNode root,int depth){if (root.left==null && root.right==null){if (depth>maxDepth){maxDepth=depth;// 更新最大深度result=root.val;// 最大深度最左面的数值}return;}if (root.left!=null){//左depth++;traversal(root.left,depth);//回溯depth--;}if (root.right!=null){//右depth++;traversal(root.right,depth);//回溯depth--;}return;}
}

递归函数简写:

public void traversal(TreeNode root,int depth){if (root.left==null && root.right==null){if (depth>maxDepth){maxDepth=depth;// 更新最大深度result=root.val;// 最大深度最左面的数值}return;}if (root.left!=null){//左traversal(root.left,depth+1);// 隐藏着回溯}if (root.right!=null){//右traversal(root.right,depth+1);// 隐藏着回溯}return;}

2. 【112】路径总和

2.1题目描述

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

叶子节点 是指没有子节点的节点。

在这里插入图片描述
提示:

  • 树中节点的数目在范围 [0, 5000] 内
  • -1000 <= Node.val <= 1000
  • -1000 <= targetSum <= 1000

2.2 解题思路

本题可以采用深度遍历的方式来遍历(本题前中后序都可以,无所谓,因为根节点也没有处理逻辑)。,递归法

请添加图片描述

2.3 java代码实现

class Solution {public boolean hasPathSum(TreeNode root, int targetSum) {if (root==null){return false;}targetSum -= root.val;//叶子结点if (root.left==null && root.right==null){return targetSum==0;}if (root.left!=null){boolean left=hasPathSum(root.left,targetSum);//已经找到if (left){return true;}}if (root.right!=null){boolean right=hasPathSum(root.right,targetSum);//已经找到if (right){return true;}}return false;}
}

3.【106】从中序与后序遍历序列构造二叉树

3.1题目描述

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
在这里插入图片描述
提示:

  • 1 <= inorder.length <= 3000
  • postorder.length == inorder.length
  • -3000 <= inorder[i], postorder[i] <= 3000
  • inorder 和 postorder 都由 不同 的值组成
  • postorder 中每一个值都在 inorder 中
  • inorder 保证是树的中序遍历
  • postorder 保证是树的后序遍历

3.2 解题思路

中序遍历与后序遍历构造二叉树的理论知识

以 后续数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来再切后续数组。一层一层的切下去,每次后续数组的最后一个元素就是节点元素。

流程如下:

在这里插入图片描述

代码该怎样写呢?提到一层一层切割,就应该想到了递归

    1. 如果数组大小为0的话,说明是空节点了
    1. 如果不为空,那么取后序数组的最后一个元素作为节点元素
    1. 找到后序数组最后一个元素在中序数组中的位置,作为切割点
    1. 切割中序数组,切成中序左数组和中序右数组(顺序一定不能弄反了,一定要先切中序数组)
    1. 切割后序数组,切成后序左数组和后序右数组
    1. 递归处理左区间和右区间

3.3 java代码实现

class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) {if (postorder.length==0 || inorder.length==0){return null;}return buildHelper(inorder,0,inorder.length,postorder,0, postorder.length);}public TreeNode buildHelper(int[] inorder,int inorderBegin,int inorderEnd,int[] postorder,int postBegin,int postEnd){if (postBegin==postEnd){return null;}//根节点int rootVal=postorder[postEnd-1];TreeNode root=new TreeNode(rootVal);//切割点int middleIndex;for (middleIndex=inorderBegin;middleIndex<inorderEnd;middleIndex++){if (inorder[middleIndex]==rootVal){break;}}//切割中序数组//左中序数组,左闭右开[leftInorderBegin,leftInoderEnd)int leftInorderBegin=inorderBegin;int leftInoderEnd=middleIndex;//右中序数组,左闭右开[rightInorderBegin,leftInoderEnd)int rightInorderBegin=middleIndex+1;int rightInoderEnd=inorderEnd;//切割后序数组//左后序数组,左闭右开[leftPostorderBegin,leftPostoderEnd)int leftPostorderBegin=postBegin;//终止位置是 需要加上 中序区间的大小sizeint leftPostoderEnd=postBegin+(middleIndex-inorderBegin);//右后序数组,左闭右开[rightPostorderBegin,leftPostoderEnd)int rightPostorderBegin=leftPostoderEnd;int rightPostoderEnd=postEnd-1;//排除最后一个元素,已经作为节点了root.left=buildHelper(inorder,leftInorderBegin,leftInoderEnd,postorder,leftPostorderBegin,leftPostoderEnd);root.right=buildHelper(inorder,rightInorderBegin,rightInoderEnd,postorder,leftPostorderBegin,rightPostoderEnd);return root;}
}
class Solution {Map<Integer,Integer> map;//方便根据数值查找位置public TreeNode buildTree(int[] inorder, int[] postorder) {map=new HashMap<>();// 用map保存中序序列的数值对应位置for (int i=0;i<inorder.length;i++){map.put(inorder[i],i );}return findNode(inorder,0,inorder.length,postorder,0,postorder.length);}public TreeNode findNode(int[] inorder,int inorderBegin,int inorderEnd,int[] postorder,int postBegin,int postEnd){//参数里的范围都是左闭右开if (inorderBegin>=inorderEnd || postBegin>=postEnd){return null;}// 找到后序遍历的最后一个元素在中序遍历中的位置int rootIndex=map.get(postorder[postEnd-1]);TreeNode root=new TreeNode(inorder[rootIndex]);//构造节点//保存中序左子树个数,用来确定后序数列的个数int lenOfleft=rootIndex-inorderBegin;root.left=findNode(inorder,inorderBegin,rootIndex,postorder,postBegin,postBegin+lenOfleft);root.right=findNode(inorder,rootIndex+1,inorderEnd,postorder,postBegin+lenOfleft,postEnd-1);return root;}}

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

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

相关文章

Linux | Linux入门及常用基础命令介绍

关注CodingTechWork Linux Linux介绍 概述 Linux出现的时候是没有图像化界面&#xff0c;都是黑屏操作&#xff0c;靠命令来完成操作&#xff0c;如磁盘读写、网络管理等。企业级服务器的维护基本都通过跳板机ssh到对应的服务器上进行操作&#xff0c;一般无图形化界面。 远…

DevEco Studio对同一套HarmonyOS代码进行多设备端预览

鸿蒙代码有一个很大的优势 不需要其他的语法 只需要一套HarmonyOS代码 就可以在 手机 平板 电脑上运行 我们可以在DevEco Studio预览器上 点击如下图指向位置 弹出的这个窗口中 我们将右上角的开关勾选上 这样 我们调试器向下滚动 就可以看到多端预览的一个效果了

Windows Server 2012R2 修复CVE-2016-2183(SSL/TLS)漏洞的办法

一、漏洞说明 Windows server 2012R2远程桌面服务SSL加密默认是开启的,且有默认的CA证书。由于SSL/ TLS自身存在漏洞缺陷,当开启远程桌面服务,使用漏洞扫描工具扫描,发现存在SSL/TSL漏洞。远程主机支持的SSL加密算法提供了中等强度的加密算法,目前,使用密钥长度大于等于5…

队列实现方式、效率分析及应用场景

文章目录 一、什么是队列二、队列特性阻塞和非阻塞有界和无界单向链表和双向链表 三、Java队列接口继承图四、Java队列常用方法五、队列实现方式与效率分析六、队列的应用场景七、Python中队列与优先级队列使用 一、什么是队列 队列是一种特殊的线性表&#xff0c;遵循先入先出…

express习惯养成小程序-计算机毕设 附源码 32209

习惯养成小程序的设计与实现 摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;习惯养成小程序被用户普遍使…

WebSocket协议在java中的使用

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

Centos7上面部署redis

Centos7上面部署redis 编写这个部署redis&#xff0c;只是为了另一个文章入侵redis做准备&#xff0c;网上还有好多类似的文章&#xff0c;这个单纯的就是部署安装&#xff0c;并简单的测试使用以下 关联其他文章 [1]VMware上面安装部署centos7镜像系统【详细含镜像】 [2]血的教…

美女骑士开箱VELO Angel TT,银色天使,无痛骑行

阳光、女孩、自行车&#xff0c;脸上的笑容或明媚&#xff0c;或神秘&#xff0c;或青涩&#xff0c;在这个时候&#xff0c;世界上没有什么比骑行女孩更美的了&#xff01;      在北京&#xff0c;有一个热爱骑行的女孩&#xff0c;名叫季思铭&#xff0c;目前是中国农业…

CDA一级备考思维导图

CDA一级备考思维导图 第一章 数据分析概述与职业操守1、数据分析概念、方法论、角色2、数据分析师职业道德与行为准则3、大数据立法、安全、隐私 CDA一级复习备考资料共计七个章节&#xff0c;如需资料&#xff0c;请留言&#xff0c;概览如下图&#xff1a; 第一章 数据分析…

【Java】使用IntelliJ IDEA搭建SSM(MyBatis-Plus)框架并连接MySQL数据库

步骤 0 准备工作1 创建Maven项目2 配置Maven依赖3 配置数据源4 项目结构5 创建实体类6 创建数据访问层7 创建服务层8 创建Controller层9 启动项目10 使用Postman测试接口 0 准备工作 下载并安装 IntelliJ IDEA下载并安装 MySQL 数据库下载并安装Postman测试工具使用 Navicat 创…

WebSocket了解

一.什么是WebSocket WebSocket是HTML5下一种新的协议&#xff08;websocket协议本质上是一个基于tcp的协议&#xff09;它实现了浏览器与服务器全双工通信&#xff0c;能更好的节省服务器资源和带宽并达到实时通讯的目的Websocket是一个持久化的协议 二.websocket的原理 web…

Linux4.5、进程状态

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 进程状态介绍 Linux下具体进程状态 R状态 和 S状态 D状态 T状态 t状态 Z状态 X状态 进程状态介绍 首先&#xff0c;进程状态有运行&#xff0c;阻塞&#xff0c;挂起&#xff0c;这些只是一个大体的概括&am…

判断 一个整数 是不是 2 的阶次方

问题&#xff1a;判断 一个整数 是不是 2 的阶次方 思路&#xff1a; 1、先用while循环&#xff0c;判断该数字是否大于1 2、大于1&#xff0c;那么进行取模2&#xff0c;判断该数字是否是偶数 3、是偶数&#xff0c;那么除以2&#xff0c;看能不能整除掉&#xff0c;整除到最…

Flutter桌面应用开发之毛玻璃效果

目录 效果实现方案依赖库支持平台实现步骤注意事项话题扩展 毛玻璃效果&#xff1a;毛玻璃效果是一种模糊化的视觉效果&#xff0c;常用于图像处理和界面设计中。它可以通过在图像或界面元素上应用高斯模糊来实现。使用毛玻璃效果可以增加图像或界面元素的柔和感&#xff0c;同…

点赞业务对MySQL和Redis和MongoDB理解

点赞 点赞业务比较频繁,很多人业务可能都会有这个,比如:博客,视频,文章,动态,评论等,但是不应该是核心业务,不应该大量地请求MySQL数据库,给数据库造成大量的资源消耗,MySQL的数据库是非常宝贵的. 以某音为例,当我去搜索的时候,全抖音比较高的点赞数目应该是在1200w - 2000w,…

【视觉SLAM十四讲学习笔记】第三讲——旋转向量和欧拉角

专栏系列文章如下&#xff1a; 【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍 【视觉SLAM十四讲学习笔记】第二讲——初识SLAM 【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵 【视觉SLAM十四讲学习笔记】第三讲——Eigen库 本章将介绍视觉SLAM的基本问题之一&#xff1a;如何…

Unity 自带的一些可以操控时间的属性或方法。

今天来总结下Unity自带的一些可以操控时间的方法。 1、Time.time。比较常用计算运行时间而触发特定事件。 public class Controller : MonoBehaviour {public float eventTime 5f; // 触发事件的时间private float startTime; // 游戏开始的时间private void Start(){startT…

计算机毕业设计|基于SpringBoot+MyBatis框架的电脑商城的设计与实现(用户资料修改)

计算机毕业设计|基于SpringBootMyBatis框架的电脑商城的设计与实现&#xff08;用户资料修改&#xff09; 该项目分析着重于设计和实现基于SpringBootMyBatis框架的电脑商城。首先&#xff0c;通过深入分析项目所需数据&#xff0c;包括用户、商品、商品类别、收藏、订单、购物…

【活动回顾】sCrypt在2023伦敦区块链大会上的精彩表现

2023伦敦区块链大会&#xff0c;是本年度最盛大的比特币及区块链行业活动。大会于2023年5月31日至6月2日&#xff0c;在伦敦女王伊丽莎白二世中心举行&#xff0c;旨在展示BSV区块链的真正潜力。 sCrypt Inc 的创始人兼 CEO 刘晓晖&#xff0c; 作为演讲嘉宾出席了会议。他向大…

掌握高效性能测试技能:JMeter基础入门!

一、JMeter基础 A、JMeter介绍 Apache JMeter是Apache组织开发的基于Java的压力测试工具。 Apache JMeter may be used to test performance both on static and dynamic resources (files, Servlets, Perl scripts, Java Objects, Data Bases and Queries, FTP Servers and …