Day14 | 找树左下角的值 路径总和 从中序与后序遍历序列构造二叉树

语言

Java

找树左下角的值

题目链接:找树左下角的值

题目

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

假设二叉树中至少有一个节点。

思路

本题有两种做法我主要讲一下递归的思路,创建两个全局变量,一个用于存树的深度,一个用于记录最下层最左树的值depth。

递归终止条件:树的左右子树都为空。 递归参数:节点,深度。

单层递归:先判断左右子树是否为空,为空了代表下面没有子树了,这时比较当前深度和全局变量的深度哪个大,当前深度大的话赋值给全局变量,也把值赋值给depth.然后判断左子树是否为空不为空的话进行递归,需要进行回溯操作。右子树同理。具体细节看代码。

代码

递归法

class Solution {int Deep = -1;int value = 0;//全局变量记录左下角的值public int findBottomLeftValue(TreeNode root) {findLeftValue(root, 0);return value;}public void findLeftValue(TreeNode root, int deep) {if (root.left == null && root.right == null) {if (deep > Deep) {Deep = deep;value = root.val;}}if (root.left != null) {deep++;findLeftValue(root.left, deep);deep--;}if (root.right != null) {//回溯deep++;findLeftValue(root.right, deep);deep--;}}
}

迭代法

class Solution {public int findBottomLeftValue(TreeNode root) {Queue<TreeNode> que = new LinkedList<>();int res = 0;que.offer(root);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;}
}

易错点

递归法时要注意全局变量,还有回溯的过程。

路径总和

题目链接:路径之和

题目链接113. 路径总和ii

题目

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

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

思路

采用递归的方法,传入的值是targetSum,对它进行减减,如果节点的左右子树都为空且targetsum为0返回TRUE,分别向左和右递归,最后没找到的话返回false.

代码

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;}}

易错点

先判断根节点是否为空再进行减减操作。

扩展

做完路径之和后,二也就会做了。不用返回true了,是将所有路径都遍历一遍。找出符合的

class Solution {public List<List<Integer>> pathSum(TreeNode root, int targetSum) {List<List<Integer>> res = new ArrayList<>();//结果数组if (root == null) return res;//非空判断List<Integer> path = new LinkedList<>();traversal(root, targetSum, res, path);return res;}public void traversal(TreeNode root, int targetSum, List<List<Integer>> res,List<Integer> path) {path.add(root.val);if (root.left == null && root.right == null) {if (targetSum - root.val == 0) {res.add(new ArrayList(path));}return;}if (root.left != null) {traversal(root.left, targetSum - root.val, res, path);path.remove(path.size() - 1);//回溯}if (root.right != null) {traversal(root.right, targetSum - root.val, res, path);path.remove(path.size() - 1);}} 
}

从中序与后序遍历序列构造二叉树

题目链接:从中序和后序遍历构造函数

题目

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

思路

用一个Map存经过中序数组遍历出值和索引,开始递归

从后序遍历中找出根节点也就是最后一个,在中序遍历中找到它的索引。

开始切割根节点左边的是左子树,右边的是右子树。

代码

class Solution {Map<Integer, Integer> map;public TreeNode buildTree(int[] inorder, int[] postorder) {map = new HashMap<>();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 inBegin, int inEnd, int[] postorder, int postBegin, int postEnd) {if (inBegin >= inEnd || postBegin >= postEnd) {return null;}int rootIndex = map.get(postorder[postEnd - 1]);TreeNode root = new TreeNode(inorder[rootIndex]);int lenLeftOf = rootIndex - inBegin;root.left = findNode(inorder, inBegin, rootIndex, postorder, postBegin, postBegin + lenLeftOf);root.right = findNode(inorder, rootIndex + 1, inEnd, postorder, postBegin + lenLeftOf, postEnd - 1);return root;}
}

易错点

递归右子树的参数传递,后序遍历的时候无需在遍历最后一个节点了。

扩展

做完中序和后序,下面试一试前序和中序。

class Solution {Map <Integer, Integer> map;public TreeNode buildTree(int[] preorder, int[] inorder) {map = new HashMap<>();for (int i = 0; i < inorder.length; i++) {map.put(inorder[i], i);}return findNode(inorder, 0 ,inorder.length, preorder, 0, preorder.length);}public TreeNode findNode(int[] inorder, int inBegin, int inEnd, int[] preorder, int preBegin, int preEnd) {if (inBegin >= inEnd || preBegin >= preEnd) {return null;}int rootIndex = map.get(preorder[preBegin]);TreeNode root = new TreeNode(inorder[rootIndex]);int lenLeftOf = rootIndex - inBegin;root.left = findNode(inorder, inBegin, rootIndex, preorder, preBegin + 1, preBegin + lenLeftOf + 1);root.right = findNode(inorder, rootIndex + 1, inEnd, preorder, preBegin + lenLeftOf + 1, preEnd);return root;}
}

 

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

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

相关文章

二叉树精选面试题

&#x1f48e; 欢迎大家互三&#xff1a;2的n次方_ 1. 相同的树 100. 相同的树 同时遍历两棵树 判断结构相同&#xff1a;也就是在遍历的过程中&#xff0c;如果有一个节点为null&#xff0c;另一棵树的节点不为null&#xff0c;那么结构就不相同 判断值相同&#xff1a;只需…

Ubuntu22.04安装与卸载nginx

换源 如果是国内的就不用换 中科大的源&#xff0c;由于我这里是Ubuntu&#xff0c;所以我就直接选Ubuntu22.04就行 点击下载&#xff0c;或者你直接复制这个sources.list的内容到linux中的/etc/apt/sources.list也可以&#xff0c;把原来的sources.list备份一下&#xff0c;…

nfs和samba

​webserver 服务器&#xff1a;作用是发布nginx的web项目 1、安装nginx&#xff08;只下载不安装&#xff09; [rootweb_server ~]# yum -y install --downloadonly --downloaddir./soft/ nginx 2、配置一个本地的nginx仓库 [rootweb_server ~]# yum -y install createrepo …

『 Linux 』信号概念与信号的产生

文章目录 信号概念前台进程与后台进程信号的本质硬件理解信号的产生 信号概念 "信号"一词指用来传达信息或只是的各种形式的提示或标志; 在生活中常见的信号例如红绿灯,交通标志,短信通知等 在操作系统中,"信号"是一种用于异步通知进程发生特定事件的机制;…

数据库-练习

题目要求&#xff1a;按照要求建立数据库与表&#xff0c;并完成相应的查询操作 解题步骤如下代码所示&#xff1a; //建立相关的数据库mydb8_worker mysql> show databases; -------------------- | Database | -------------------- | information_schema | | …

NMEA 2000航空插头插座选择

一、概述 NMEA 2000航空插头插座是船舶电子设备中不可或缺的部分&#xff0c;它们负责在船舶的各种电子系统间传输数据和电源信号。选择合适的NMEA 2000航空插头插座对于确保船舶电子系统的稳定性和可靠性至关重要。本文将详细探讨如何选择合适的NMEA 2000航空插头插座&#xf…

解决方案架构师系列 - AWS - Pinpoint

AWS Pinpoint介绍 Amazon Pinpoint 为营销人员和开发人员提供了一款可自定义的工具&#xff0c;助力他们大规模地开展跨渠道、行业和活动的客户通信。 Amazon Pinpoint是一个全面的客户参与平台&#xff0c;‌旨在帮助营销人员和开发人员大规模地开展跨渠道、‌行业和活动的客…

Intellij IDEA 的Plugins加载不出来的解决方法

一、点开插件---右上角设置---HTTP代理设置 二、勾选自动检测代理设置 输入url&#xff1a; https://plugins.jetbrains.com/ 配置完成后&#xff0c;点击确定。 然后点击检查连接&#xff0c;再一次输入那个URL&#xff0c;一般来说可以连接成功了 然后 重启IDEA以刷新缓…

UE TSharedPtr

文章目录 概述TSharedPtrTSharedPtr包含2部分 构造&#xff0c;析构&#xff0c;拷贝构造&#xff0c;移动构造构造拷贝构造移动构造 小结 概述 之前写过一篇c的智能指针的&#xff0c;这篇写下ue的。本质上来说是差不多的&#xff0c;可以简单看看。 TSharedPtr 如下图&…

基于SpringBoot+Vue的篮球竞赛预约平台(带1w+文档)

基于SpringBootVue的篮球竞赛预约平台(带1w文档) 基于SpringBootVue的篮球竞赛预约平台(带1w文档) 本系统提供给管理员对首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;项目分类管理&#xff0c;竞赛项目管理&#xff0c;赛事预约管理&#xff0c;系统管理等诸多功…

2-40 基于Matlab编写的3维FDTD(时域有限差分算法)计算了球的RCS经典散射问题

基于Matlab编写的3维FDTD(时域有限差分算法)计算了球的RCS经典散射问题&#xff0c;采用PEC作边界&#xff0c;高斯波束激励。程序已调通&#xff0c;可直接运行。 2-40 3维FDTD 时域有限差分算法 - 小红书 (xiaohongshu.com)

Meta Quest3 激活更新不动的问题

1. Meta Quest3激活过程中遇到更新不动的情况&#xff0c;如下图所示&#xff1a; 2. 关机 3. 开机检查连接的wifi&#xff0c;是否存在受限的情况&#xff0c;如果存在受限情况&#xff0c;则说明当前的mofa只支持TCP&#xff0c;需要设置支持UDP模式。 具体操作是设置魔法…

细节决定成败:电商详情页全攻略

电子商务产品细节页面作为电子商务信息的主要承载页面&#xff0c;也是电子商务业务转型的主要战场。因此&#xff0c;商业详细页面的设计和规划是电子商务产品设计的核心&#xff0c;承担着转化率&#xff0c;甚至是产品设计的KPI。 电子商务作为传统商品交易在互联网领域的表…

探究比表面积测试的方法、仪器与原理-测试狗

探究比表面积测试的方法、仪器与原理 比表面积是指单位质量物质所具有的表面积&#xff0c;它是衡量物质性能的重要参数之一。比表面积测试在材料科学、环境保护、化工等领域具有广泛的应用。比表面积测试方法多样&#xff0c;仪器各异&#xff0c;下面测试狗就为大家介绍一些比…

Windows版MySQL5.7解压直用(如何卸载更换位置重新安装)

文章目录 停止mysql进程及服务迁移整个mysql文件夹删除data重启计算机重新安装 停止mysql进程及服务 net stop mysql mysqld -remove mysql迁移整个mysql文件夹 删除data 重启计算机 shutdown -r -t 0重新安装 https://blog.csdn.net/xzzteach/article/details/137723185

Linux_线程的同步与互斥

目录 1、互斥相关概念 2、代码体现互斥重要性 3、互斥锁 3.1 初始化锁 3.2 申请、释放锁 3.3 加锁的思想 3.4 实现加锁 3.5 锁的原子性 4、线程安全 4.1 可重入函数 4.2 死锁 5、线程同步 5.1 条件变量初始化 5.2 条件变量等待队列 5.3 唤醒等待队列…

视觉网络的有效调制

摘要 链接&#xff1a;https://arxiv.org/pdf/2403.19963 在这项工作中&#xff0c;我们提出了高效调制&#xff08;EfficientMod&#xff09;&#xff0c;这是一种用于高效视觉网络的新型设计。我们重新审视了调制机制&#xff0c;该机制通过卷积上下文建模和特征投影层处理输…

Java并发(三)Java并发核心机制

J.U.C 简介 Java 的 java.util.concurrent 包&#xff08;简称 J.U.C&#xff09;中提供了大量并发工具类&#xff0c;是 Java 并发能力的主要体现&#xff08;注意&#xff0c;不是全部&#xff0c;有部分并发能力的支持在其他包中&#xff09;。从功能上&#xff0c;大致可以…

Spring Boot 日志 (初级)

什么是日志呢&#xff1f;其实就是一条条的打印语句&#xff0c;我们就可以根据打印出来的日志&#xff0c;去分析程序存在的问题等。虽然作为后端开发人员&#xff0c;日志并不是那么重要&#xff0c;但是在学习的过程中&#xff0c;也是比较重要的&#xff0c;可以使用在我们…

[Spring] Spring配置文件

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…