代码随想录算法训练营第16天|二叉树part 04

513.找树左下角的值

题目链接:513. 找树左下角的值 - 力扣(LeetCode)

视频链接:代码随想录 (programmercarl.com)

第一想法

 既然提示说迭代比递归简单一点,那就是找到到最后一层的第一个节点然后返回。那么怎么确定是最后一层呢?

每层遍历时先标记第一个节点tempNode,设置此层是否为最后一层标记flag = true。如果加入非空节点那么说明还有下层,此层就不是最后一层,flag=false。此层遍历解说后flag=true,那么就返回tempNode。

代码随想录

一直向左遍历不是二叉树的左下角,深度最大的叶子节点一定是最后一行。那么如何求得第一个节点呢?前序:中左右,中序:左中右,后序:左右中。本题没有中节点的处理逻辑,那么三种方式其实都相当于优先遍历左节点。一旦得到了深度最大得叶子节点,那么它一定是最靠近左侧的。  

最靠左侧的值未必就是左孩子,只要优先遍历左侧就可以。

如果是层序遍历则不用很麻烦,每层遍历记录第一个节点。所有层遍历完后直接返回这个记录值即可。它一定是最后一层得第一个节点。

代码

class Solution {public int findBottomLeftValue(TreeNode root) {Deque<TreeNode> deque = new LinkedList<>();deque.offer(root);int result = 0;while (!deque.isEmpty()){int size = deque.size();for (int i = 0; i < size; i++) {TreeNode tempNode = deque.poll();if(i==0)result = tempNode.val;if(tempNode.left!=null)deque.offer(tempNode.left);if(tempNode.right!=null)deque.offer(tempNode.right);}}return result;}
}
class Solution1 {int maxDepth = Integer.MIN_VALUE;int result = 0;public int findBottomLeftValue(TreeNode root) {traversal(root,1);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--;//回溯,深度-1}//再遍历右节点if(root.right!=null){depth++;traversal(root.right,depth);depth--;}//中间节点是不做处理的。}
}

 路径总和

题目链接:112. 路径总和 - 力扣(LeetCode)  113. 路径总和 II - 力扣(LeetCode)

文档/视频链接:代码随想录 (programmercarl.com)

代码随想录

返回值是Boolean,在这颗二叉树里只需要找到一条路径符合返回直接返回就可以,没有必要遍历所有的节点。所以一旦到叶子节点发现符合要求后,就一路将true返回直至根节点。

参数:计数器 count,TreeNode node

正向思考是:传入0,每遇到一个节点,就加val,看看是不是与target相等。

反向思考:更简单一些,这里直接传入目标值。遇到一个节点就减val。如果到叶子节点,该数值减为0,那么沿此路的所有节点相加恰好等于target。

终止条件:叶子节点并且count为0,return true。

                  叶子节点但count不为0,return false。

单层递归逻辑:

        以上没有对root做判空。

        若左不为空:count减左节点的值,递归遍历左孩子。如果左孩子遍历返回来的值是true,则左方向有符合题目要求的路径,那么就应该将这个true结果继续向上返回。回溯将左方向的值加回来。

        若右不为空:

        如果都没有返回true,那么最终返回false

代码

//LeetCode112
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){if(hasPathSum(root.left,targetSum)) return true;}if(root.right!=null){if (hasPathSum(root.right,targetSum))return true;}return false;}
}

LeetCode113,自己写的有错误,还没找出来原因。

class Solution {List<List<Integer>> result;LinkedList<Integer> path;public List<List<Integer>> pathSum (TreeNode root,int targetSum) {result = new LinkedList<>();path = new LinkedList<>();travesal(root, targetSum);return result;}private void travesal(TreeNode root,  int count) {if (root == null) return;path.offer(root.val);count -= root.val;if (root.left == null && root.right == null && count == 0) {result.add(new LinkedList<>(path));}travesal(root.left, count);travesal(root.right, count);path.removeLast(); // 回溯}
}

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

题目链接:106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)

文档/视频链接:代码随想录 (programmercarl.com)

代码随想录想法

框架:

  • 第一步:如果数组大小为零的话,说明是空节点了。

  • 第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。

  • 第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点

  • 第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)

  • 第五步:切割后序数组,切成后序左数组和后序右数组

  • 第六步:递归处理左区间和右区间

class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) {if(inorder.length==0||postorder.length==0)return null;return buildHelper(inorder,0,inorder.length,postorder,0,postorder.length);}public TreeNode buildHelper(int[] inorder, int inorderStart, int inorderEnd, int[] postorder, int postorderStart, int postorderEnd) {if(postorderStart==postorderEnd)return null;int rootValue = postorder[postorderEnd - 1];TreeNode root = new TreeNode(rootValue);int middleIndex;for(middleIndex = inorderStart;middleIndex<inorderEnd;middleIndex++){if(inorder[middleIndex]==rootValue)break;}//[leftInorderStart,leftInorderEnd)int leftInorderStart = inorderStart;int leftInorderEnd = middleIndex;int rightInorderStart = middleIndex+1;int rightInorderEnd = inorderEnd;int leftPostorderStart = postorderStart;int leftPostorderEnd = postorderStart+(leftInorderEnd-leftInorderStart);int rightPostorderStart = leftPostorderEnd;int rightPostorderEnd = postorderEnd-1;root.left = buildHelper(inorder,leftInorderStart,leftInorderEnd,postorder,leftPostorderStart,leftPostorderEnd);root.right = buildHelper(inorder,rightInorderStart,rightInorderEnd,postorder,rightPostorderStart,rightPostorderEnd);return root;}
}

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

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

相关文章

微服务重启优化kafka+EurekaNotificationServerListUpdater

由于遇到服务重启导致的业务中断等异常&#xff0c;所以计划通过kafkaeureka实现服务下线通知&#xff0c;来尽可能规避这类问题。 如果可以升级spring&#xff0c;则可以考虑nacos等更为方便的方案&#xff1b; 程序优化&#xff1a; 1.默认启用的为 PollingServerListUpdater…

Ubuntu22,ROS2 colcon/cmake 编译卡死问题解决

使用colcon build编译ros工程时,ubuntu系统卡死,风扇狂转。 1. 限制 colcon build 并行编译线程数 colcon build默认使用并行编译,线程数跟CPU内核数相同。可使用下述命令,查询cpu内核数: nproc 可限制并行编译数量,或采用串行编译: colcon build --parallel-workers…

DP(7) | 打家劫舍① | Java | LeetCode 198, 213, 337 做题总结(未完)

打家劫舍问题 来源于代码随想录&#xff1a;https://programmercarl.com/0198.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8D.html#%E6%80%9D%E8%B7%AF ① 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i]&#xff1a;考虑下标i&#xff08;包括i&#xff09;以内的房…

计算机视觉发展历程

文章目录 前言一、发展历程1&#xff09;、萌芽期&#xff08;1960s-1970s&#xff09;2&#xff09;、基础发展期&#xff08;1980s&#xff09;3&#xff09;、系统开发期&#xff08;1990s-2000s&#xff09;4&#xff09;、深度学习兴起期&#xff08;2010s&#xff09;5&a…

钡铼分布式 IO 系统 OPC UA边缘计算耦合器BL205

深圳钡铼技术推出的BL205耦合器支持OPC UA Server功能&#xff0c;以服务器形式对外提供数据。符合IEC 62541工业自动化统一架构通讯标准&#xff0c;数据可以选择加密&#xff08;X.509证书&#xff09;、身份验证方式传送。 安全策略支持basic128rsa15、basic256、basic256s…

【Git远程操作】理解分布式管理 | 创建远程仓库

目录 1.理解分布式管理 多人协作开发 2.创建远程仓库 2.1仓库名&路径 2.2初始化仓库&设置模板 1.理解分布式管理 目前我们学习的所有内容都是在本地来完成的。&#xff08;add /commit /版本撤销回退/分支管理&#xff09; Git是一个分布式 的版本控制系统。 分支…

数据挖掘与分析部分实验与实训项目报告

一、机器学习算法的应用 1. 朴素贝叶斯分类器 相关代码 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB, MultinomialNB from sklearn.metrics import accuracy_score # 将数据加载到DataFrame中&a…

mtsys2 编译 qemu 记录

参考链接 下载 MSYS2 MSYS2 MSYS2 换源 进入目录\msys64\etc\pacman.d&#xff0c; 在文件mirrorlist.msys的前面插入 Server http://mirrors.ustc.edu.cn/msys2/msys/$arch在文件mirrorlist.mingw32的前面插入 Server http://mirrors.ustc.edu.cn/msys2/mingw/i686在…

算法工程师第十四天(找树左下角的值 路径总和 从中序与后序遍历序列构造二叉树 )

参考文献 代码随想录 一、找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7 层次遍历&#…

【hadoop大数据集群 2】

【hadoop大数据集群 2】 文章目录 【hadoop大数据集群 2】1. 虚拟机克隆2. 时间同步3. 环境变量配置、启动集群、关闭集群 1. 虚拟机克隆 克隆之后一定要重新生成新虚拟机唯一的MAC地址和UUID等&#xff0c;确保新虚拟机与源虚拟机在网络拓扑中不发生冲突。 注意1.生成新的MA…

Pytorch学习笔记day3——用神经网络学习一组函数

好的&#xff0c;我们开始吧。首先第一个问题&#xff0c;神经网络的本质是什么&#xff1f;是古典主义的人类的神经元吗&#xff1f;绝对不是&#xff0c;他只是一个优化函数 y f θ ( x ) y f_{\theta}(x) yfθ​(x) 这和小学学到的线性函数拟合并无本质区别。只是其中参数…

Android13 应用代码中修改热点默认密码

Android 13 修改热点密码 [TOC] 一、前言 Android 有些情况会有修改热点信息的需求&#xff0c;比如修改热点默认名称、默认密码登信息。 之前也有介绍过通过Java系统具体源码修改热点默认配置&#xff1a; https://blog.csdn.net/wenzhi20102321/article/details/1277375…

uniapp form表单校验

公司的一个老项目&#xff0c;又要重新上架&#xff0c;uniapp一套代码&#xff0c;打包生成iOS端发布到App Store&#xff0c;安卓端发布到腾讯应用宝、OPPO、小米、华为、vivo&#xff0c;安卓各大应用市场上架要求不一样&#xff0c;可真麻烦啊 光一个表单校验&#xff0c;…

云手机结合自主ADB命令接口 提升海外营销效率

现在&#xff0c;跨境电商直播已经成为在线零售的重要渠道&#xff0c;在大环境下&#xff0c;确保直播应用的稳定性和用户体验至关重要。 云手机支持自主ADB命令接口&#xff0c;为电商直播营销提供了技术支持&#xff0c;使得应用开发、测试、优化和运维更加高效。 什么是A…

【sklearn | 7】:scikit-learn项目实战指南

引言 在数据科学和机器学习领域&#xff0c;Python以其简洁的语法和强大的库支持&#xff0c;成为了许多开发者和研究者的首选语言。而在众多Python机器学习库中&#xff0c;scikit-learn以其易用性、灵活性和强大的算法集合&#xff0c;成为了最受欢迎的库之一。本文将深入探…

【驱动程序】霍尔编码器电机_CubeMX_HAL库

【驱动程序】霍尔编码器电机_CubeMX_HAL库 电机型号&#xff1a;MG310 霍尔编码器电机 驱动模块&#xff1a;L298N 接线 注&#xff1a; L298N 12V接线柱位置可以接50V~5V当跳线帽接入时&#xff0c;5V接线柱为5V输出&#xff0c;可以给驱动板供电当跳线帽拔出时&#xff0…

内部类+图书管理系统

内部类图书管理系统 1. 实例内部类1.1 实例内部类的结构1.2 实例内部类的一些问题1.2.1 如何在main中创建实例内部类对象&#xff1f;1.2.2 内部类成员变量被static修饰问题&#xff1f;1.2.3 内部类和外部类变量重名的调用问题&#xff1f;1.2.4 外部类访问内部类变量的问题 2…

电商人批量下载神器阿里国际高清主图、详情图、sku及视频信息

电商领域&#xff0c;图片是商品静默的推销员。高质量的图片能吸引顾客目光&#xff0c;传达商品信息&#xff0c;提升购买欲望。它影响产品的第一印象&#xff0c;直接关联转化率和销售额。简而言之&#xff0c;优质图片对电商至关重要。 使用图快下载器&#xff0c;小编给大…

彻底解决idea的编解码问题

一、打开idea&#xff0c;找到Setting,点击File Encoding编解码设置&#xff0c;将以下标红的三个部分全部设置为UTF-8.同理如果你的项目使用的是GBK或者其他编码格式&#xff0c;那么也设置为统一。 二、点击Java Compiler设置补齐-encoding utf-8参数 三、如果你的项目使用到…

Tailwind CSS常见用法

1. 布局类 container&#xff1a;创建一个最大宽度的容器&#xff0c;用于页面布局。 flex&#xff1a;使元素成为弹性容器。 grid&#xff1a;使元素成为网格容器。 mx-auto&#xff1a;使元素水平居中&#xff08;通常需要设置宽度&#xff09;。 2. 间距类&#xff08;Mar…