代码随想录算法训练营,9月12日 | 513.找树左下角的值,112. 路径总和,106.从中序与后序遍历序列构造二叉树

news/2025/1/15 14:20:24/文章来源:https://www.cnblogs.com/wowoioo/p/18411199

513.找树左下角的值
题目链接:513.找树左下角的值
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰找树左下角的值
日期:2024-09-12

想法:1.迭代:用层序遍历,遍历每层时记录下第一个节点的值,到最后一层就是要求的值;2.递归:根据最大的深度来找目标值。
Java代码如下:

//迭代
class Solution {public int findBottomLeftValue(TreeNode root) {Queue<TreeNode> que = new LinkedList<TreeNode>();if(root != null) que.offer(root);int res = 0;while(!que.isEmpty()){int size = que.size();for(int i = 0; i < size; i++){TreeNode node = que.poll();if(i == 0){res = node.val;}if(node.left != null){que.offer(node.left);}if(node.right != null){que.offer(node.right);}}}return res;}
}
//递归
class Solution {private int maxDeep = -1;private int value = 0;public int findBottomLeftValue(TreeNode root) {findLeftValue(root,0);return value;}private void findLeftValue (TreeNode root,int deep) {if (root.left == null && root.right == null) {if (deep > maxDeep) {value = root.val;maxDeep = deep;}return;}if (root.left != null) {deep++;findLeftValue(root.left,deep);deep--;}if (root.right != null) {deep++;findLeftValue(root.right,deep);deep--;}return;}
}

112. 路径总和
题目链接:112. 路径总和
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰路径总和
日期:2024-09-12

想法:用减到0来判断。
Java代码如下:

class Solution {private boolean travel(TreeNode root, int Sum){if(root.left == null && root.right == null && Sum == 0) return Sum == 0;if(root.left != null){Sum -= root.left.val;if(travel(root.left, Sum)) return true;Sum += root.left.val;}if(root.right != null){Sum -= root.right.val;if(travel(root.right, Sum)) return true;Sum += root.right.val;}return false;}public boolean hasPathSum(TreeNode root, int targetSum) {if(root == null){return false;}return travel(root, targetSum - root.val);}
}

总结:回溯很晕,还需要点时间。

106.从中序与后序遍历序列构造二叉树
题目链接:106.从中序与后序遍历序列构造二叉树
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰从中序与后序遍历序列构造二叉树
日期:2024-09-12

想法:第一步:如果数组大小为零的话,说明是空节点了;第二步:如果不为空,那么取后序数组最后一个元素作为节点元素;第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点;第四步:切割中序数组,切成中序左数组和中序右数组;第五步:切割后序数组,切成后序左数组和后序右数组;第六步:递归处理左区间和右区间。可以设置中序区间:[inorderBegin, inorderEnd),后序区间[postorderBegin, postorderEnd),相当于找到每一层的根。
Java代码如下:

//106.从中序与后序遍历序列构造二叉树
class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) {if(postorder.length == 0){return null;}return build(inorder, 0, inorder.length, postorder, 0, postorder.length);}private TreeNode build(int[] inorder, int instart, int inend, int[] postorder, int poststart, int postend){if(postend - poststart == 0){return null;}int rootValue = postorder[postend - 1];TreeNode root = new TreeNode(rootValue);int i = 0;for(; i < inorder.length; i++){if(inorder[i] == rootValue){break;}}int leftinstart = instart;int leftiend = i;//分割点,左闭右开int rightinstart = i + 1;int rightinend = inend;int leftpoststart = poststart;int leftpostend = poststart + (i - leftinstart);//长度等于前序中的int rightpoststart = poststart + (i - leftinstart);//都是左闭右开int rightpostend = postend - 1;root.left = build(inorder, leftinstart, leftiend, postorder, leftpoststart, leftpostend);root.right = build(inorder, rightinstart, rightinend, postorder, rightpoststart, rightpostend);return root;}
}//105. 从前序与中序遍历序列构造二叉树(思路是一样的)
class Solution {public TreeNode buildTree(int[] preorder, int[] inorder) {if(preorder.length == 0){return null;}return build(inorder, 0, inorder.length, preorder, 0, preorder.length);}private TreeNode build(int[] inorder, int instart, int inend, int[] preorder, int prestart, int preend){if(preend - prestart == 0){return null;}int rootValue = preorder[prestart];TreeNode root = new TreeNode(rootValue);int i = 0;for(; i < inorder.length; i++){if(inorder[i] == rootValue){break;}}int leftinstart = instart;int leftinend = i;//分割点,左闭右开int rightinstart = i + 1;int rightinend = inend;int leftprestart = prestart + 1;int leftpreend = prestart + 1 + (i - leftinstart);//长度等于前序中的int rightprestart = prestart + 1 +(i - leftinstart);//都是左闭右开int rightpreend = preend;root.left = build(inorder, leftinstart, leftinend, preorder, leftprestart, leftpreend);root.right = build(inorder, rightinstart, rightinend, preorder, rightprestart, rightpreend);return root;}
}

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

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

相关文章

dc-4

靶机下载地址:dc-4 找靶机 nmap -sV 192.168.6.0/24查看一下端口服务很明显就只是一个简单的登录框 我们爆破一下 最终得到用户名:admin 密码:happy 进去看看怎么个事很明显是一个选择既定的命令进行命令执行 我们可以抓包然后即可使用我们自己设计的命令直接拿shell然后再实现…

java方法:什么是方法?

java方法是语句的集合,它们在一起执行一个功能:方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 例如:即 ______()是方法 设计方法的原则:方法的本意时功能块,就是实现某个功能块,就是实现某个功能的语句块的集合,所以…

pediatrics_llm_qa:儿科问诊小模型

项目简介 本项目开源了基于儿科医疗指令微调的问诊模型:pediatrics_llm_qa(GitHub - jiangnanboy/pediatrics_llm_qa),目前模型的主要功能如下:智能问诊:问诊后给出诊断结果和建议。更新[2024/09/11] 开源了基于Qwen2-1.5B-instruct lora指令微调的儿科问诊模型开源模型模型…

WPF 已知问题 包含 NaN 的 Geometry 几何可能导致渲染层抛出 UCEERR_RENDERTHREADFAILURE 异常

本文记录一个 WPF 已知问题,当传入到渲染的 Geometry 几何里面包含了 NaN 数值,将可能让应用程序收到从渲染层抛上来的 UCEERR_RENDERTHREADFAILURE 异常,且此异常缺乏必要信息,比较难定位到具体错误逻辑此问题是小伙伴报告给我的,详细请看 https://github.com/dotnet/wpf…

WPF 尝试使用 WinML 做一个简单的手写数字识别应用

最近我看了微软的 AI 训练营之后,似乎有点了解 Windows Machine Learning 和 DirectML 的概念,于是我尝试实践一下,用 WPF 写一个简单的触摸手写输入的画板,再使用大佬训练好的 mnist.onnx 模型,对接 WinML 实现一个简单的手写数字识别应用最近我看了微软的 AI 训练营之后…

VisualStudio 2022 找不到内存 反汇编 寄存器调试工具

本文将告诉大家如何解决在 VisualStudio 2022 的 调试-窗口 里面找不到内存、 反汇编、 寄存器这三个调试工具的问题找不到的原因是没有启用地址级调试 只需要在“工具”(或“调试”)>“选项”>“调试”中选择“启用地址级调试” 然后进行调试即可看到开启之后,即可在…

【TS】TypeScript基础详解【一】

Javascript 类型缺陷 类型引发的问题 在编程开发中,有一个共识:错误越早发现,就越容易解决。 例如:能在代码编写时发现错误,就不要等到代码编译时才发现(这也是IDE的优势之一)。 能在代码编译时发现错误,就不要在代码运行时才发现(类型检测可以帮助我们在这 方面做得很好…

【OpenFeign 】OpenFeign 的常用配置

1 前言 上节我们看了下 OpenFeign 里的重试,在从源码的角度看它的执行原理的时候,又意外的遇到了一个【OpenFeign 】OpenFeign 下未开启重试,服务却被调用了两次 的问题的分析,后面我们又看了重试器的入场和执行时机,那么本节我们看看 OpenFeign 的一些常用配置,以及全局…

Splay 浅谈

Splay 树 定义 Splay 树是一个二叉平衡搜索树,它可以通过 Splay 操作 将一个结点旋转至根结点或者一个给定的结点的下一层,使得整棵树仍然满足二叉搜索树的性质。 Splay 树可以在均摊 \(O(\log n)\) 的时间内完成查找、插入、查询、删除等操作。二叉搜索树的定义:空树是一个…

从kmp到AC自动机

知道kmp的请跳过这一段 找到最清晰的解析 kmp 我看了约114514个解析才搞懂 如何求next 首先,next[i]本应表示0~i的字符串的最长相同前缀后缀的长度。 不过为了方便匹配,实际可以存最长相同前缀后缀时前缀最后一个的地址 听起来好绕 那这么说吧: 例如串 abaabaabaab next[0]=…

LinkedHashMap原理详解—从LRU缓存机制说起

写在前面 从一道Leetcode题目说起 首先,来看一下Leetcode里面的一道经典题目:146.LRU缓存机制,题目描述如下:请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类:LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 in…

微积分快速入门1部分:直觉

1 一分钟微积分:X射线和延时视觉 我们通常只看到图形、公式和情况的表面价值。微积分为我们提供了两种深入挖掘的超能力:X射线能看到图案中隐藏的部分。你不仅能看到树,还能知道它是由年轮组成的,在我们说话的同时,另一个年轮也在生长。延时视觉你能看到物体未来的运行轨迹…