LeetCode刷题笔记之二叉树(三)
一、寻找特定节点
1. 404【左叶子之和】
- 题目: 给定二叉树的根节点 root ,返回所有左叶子之和。
- 代码:
class Solution {public int sumOfLeftLeaves(TreeNode root) {//左叶子不止是最左边的叶子,而是二叉树中每个节点的左叶子//每棵树的左叶子之和=左子树左叶子之和+右子树左叶子之和//其中,左子树可能是一个叶子节点,它的左叶子之和就是它本身if(root == null) return 0;int leftSum = 0;if(root.left!=null && root.left.left==null && root.left.right==null){leftSum = root.left.val;}else{leftSum = sumOfLeftLeaves(root.left);}int right = sumOfLeftLeaves(root.right);return leftSum+right;}
}
2. 513【找树左下角的值】
- 题目: 给定一个二叉树的 根节点 root,请找出该二叉树的最底层最左边节点的值。假设二叉树中至少有一个节点。
- 代码:
class Solution {public int findBottomLeftValue(TreeNode root) {//最底层最左边,也就是层序遍历最后一层的第一个节点Deque<TreeNode> queue = new ArrayDeque<>();queue.offer(root);TreeNode ansNode = root;while (!queue.isEmpty()){int len = queue.size(); //必须提前声明,因为每次循环queue的长度都会变化for (int i = 0; i < len; i++) {TreeNode tempNode = queue.poll();if(i == 0){ansNode = tempNode;}if(tempNode.left != null){queue.offer(tempNode.left);}if(tempNode.right != null){queue.offer(tempNode.right);}}}return ansNode.val;}
}
二、构造二叉树
1. 106【从中序与后序遍历序列构造二叉树】
- 题目: 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
- 代码:
class Solution {public TreeNode buildSubTree(int[] inorder,int inStart,int inEnd,int[] postorder,int postStart,int postEnd){//如果后序遍历数组为空,则表示该部分节点构建完成if(postEnd == postStart){return null;}TreeNode root = new TreeNode(postorder[postEnd-1]);int middle;for (middle = inStart; middle < inEnd ; middle++) {if(inorder[middle] == postorder[postEnd-1]){break;}}//注意后续遍历数组的分割点TreeNode leftNode = buildSubTree(inorder,inStart,middle,postorder,postStart,postStart+middle-inStart);TreeNode rightNode = buildSubTree(inorder,middle+1,inEnd,postorder,postStart+middle-inStart,postEnd-1);root.left = leftNode;root.right = rightNode;return root;}public TreeNode buildTree(int[] inorder, int[] postorder) {//已知中序遍历和前序遍历可以确定唯一二叉树//已知中序遍历和后序遍历可以确定唯一二叉树//因为后序遍历为左右根,所以后序遍历数组中最后一个元素为二叉树的根//在中序遍历数组中,根的左边为根的左子树,根的右边为根的右子树//因为中序遍历为左根右,所以在中序遍历中根的左边有n个节点,//在后序遍历中最左边n个节点构成根的左子树if(inorder.length==0 || postorder.length==0) return null;//首先,找到根,根据根划分后序遍历数组//然后,根据后序遍历数组划分中序遍历数组TreeNode root = buildSubTree(inorder,0,inorder.length,postorder,0,postorder.length);return root;}
}
2. 105【从前序与中序遍历序列构造二叉树】
- 题目: 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
- 代码:
class Solution {public TreeNode buildSubTree(int[] preorder,int preStart,int preEnd,int[] inorder,int inStart,int inEnd){if(preEnd == preStart){return null;}TreeNode root = new TreeNode(preorder[preStart]);int middle;for(middle=inStart;middle<inEnd;middle++){if(preorder[preStart] == inorder[middle]){break;}}TreeNode leftNode = buildSubTree(preorder,preStart+1,preStart+1+middle-inStart,inorder,inStart,middle);TreeNode rightNode = buildSubTree(preorder,preStart+1+middle-inStart,preEnd,inorder,middle+1,inEnd);root.left = leftNode;root.right = rightNode;return root;}public TreeNode buildTree(int[] preorder, int[] inorder) {//与上一题相似,只是这里在前序遍历数组由前向后遍历if(preorder.length==0 || inorder.length==0){return null;}return buildSubTree(preorder,0,preorder.length,inorder,0,inorder.length);}
}
3. 654【最大二叉树】
- 题目: 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:
(1)创建一个根节点,其值为 nums 中的最大值。
(2)递归地在最大值 左边 的 子数组前缀上 构建左子树。
(3)递归地在最大值 右边 的 子数组后缀上 构建右子树。
(4)返回 nums 构建的 最大二叉树 。 - 代码:
class Solution {public TreeNode constructMaximumBinaryTree(int[] nums) {//首先,找到最大值,根据最大值划分数组//最大值左边组成左子树,最大值右边组成右子树,最大值构建根//左子树,右子树递归构建//递归时需要传入所有要进行构建树的值,因此需要return constructTree(nums,0,nums.length);}public TreeNode constructTree(int[] nums,int start, int end){if(end <= start){return null;}int max = nums[start];int index = start;for (int i = start; i < end; i++) {if(nums[i]>max){index = i;max = nums[i];}}TreeNode root = new TreeNode(nums[index]);TreeNode leftNode = constructTree(nums,start,index);TreeNode rightNode = constructTree(nums,index+1,end);root.left = leftNode;root.right = rightNode;return root;}
}
4. 617【合并二叉树】
- 题目: 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
- 代码:
class Solution {public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {//在一棵树的基础上操作,直接加上另一棵树该位置的值,如果为null,值为0//采用前序遍历,终止条件为一棵树遍历完成if(root1 == null) return root2;if(root2 == null) return root1;root1.val = root1.val+root2.val;root1.left = mergeTrees(root1.left,root2.left);root1.right = mergeTrees(root1.right,root2.right);return root1;}
}
相关文章:
LeetCode刷题笔记之二叉树(三)
一、寻找特定节点 1. 404【左叶子之和】 题目: 给定二叉树的根节点 root ,返回所有左叶子之和。代码: class Solution {public int sumOfLeftLeaves(TreeNode root) {//左叶子不止是最左边的叶子,而是二叉树中每个节点的左叶子…...
IBM在闪存系统集成实时恶意软件I/O检测功能
IBM在其最新一代FlashCore Modules(FCMs)固件中集成了使用机器学习进行实时勒索软件和其他攻击检测的功能。这些FCMs是专用于IBM FlashSystem 5000和Storwize阵列的闪存驱动器,采用U.2外形尺寸及NVMe接口。现有的第三代FCMs分别提供4.8、9.6、…...
bpmn-js中实现xml数据转为json数据
开发bpmn-js建模器,希望将bpmn数据格式转为json数据格式更加清晰的展示数据层次,以结果为导向分析需求,实现功能的思路有两种方式: 通过bpmn-js转化为JS数据对象,然后通过JS中提供的JSON模块转换为json数据将xml解析成dom对象,通过dom对象转化为json格式数据三方库这里主…...
HUAWEI Programming Contest 2024(AtCoder Beginner Contest 342)(A,B,C,D,E,F,G)
看不懂的英文,题意很难理解,这场还是有点难度的。 C需要处理,D是不太明显的dijikstra,E是线段树优化dp,F是个不好想的线段树,主席树应该也能做。 我觉得讲的很好的宝藏up主->B站视频讲解。之后会比较忙…...
解决Docker镜像中CentOS 8仓库问题
前言: 在yum执行过程中,持续遇到与CentOS 8上的’appstream’仓库元数据检索相关的错误。具体错误消息为:“错误:下载’appstream’仓库元数据失败:无法准备内部镜像列表:镜像列表中没有URL。” 问题分析&…...
顶顶通呼叫中心中间件-如何使处于机器人话术中的通话手动转接到坐席分机上讲解(mod_cti基于FreeSWITCH)
顶顶通呼叫中心中间件使用httpapi实现电话转接操作过程讲解(mod_cti基于FreeSWITCH) 需要了解呼叫中心中间件可以点以下链接了解顶顶通小孙 1、使用httpapi接口转接 一、打开web版的ccadmin并且找到接口测试 打开web-ccadmin并且登录,登录完成之后点击运维调试-再…...
HarmonyOS—使用数据模型和连接器
Serverless低代码开发平台是一个可视化的平台, 打通了HarmonyOS云侧与端侧能力,能够轻松实现HMS Core、AGC Serverless能力调用。其中,数据模型和连接器是两大主要元素。开发者在使用DevEco Studio的低代码功能进行开发时,可以使用…...
基于MQTT协议实现微服务架构事件总线
一、场景描述 昨天在博客《客户端订阅服务端事件的实现方法》中提出了利用websocket、服务端EventEmitter和客户端mitt实现客户端订阅服务端事件,大大简化了客户端对服务端数据实时响应的逻辑。上述方案适用于单服务节点的情形。 对于由服务集群支撑的微服务架构&…...
免费的Git图形界面工具sourceTree介绍
阅读本文同时请参阅-----代码库管理工具Git介绍 sourceTree是一款免费的Git图形界面工具,它简化了Git的使用过程,使得开发者可以更加方便地下载代码、更新代码、提交代码和处理冲突。下面我将详细介绍如何使用sourceTree进行这些操作。 1.下载和…...
【Appium UI自动化】pytest运行常见错误解决办法
通过Appium工具录制代码在pycharm上运行报错: 错误一: 1.提示 setup() 方法运行 error failed 解决办法:未创建 init __ 方法,创建一个空的__init.py文件就解决了。 原因: 错误二: 2.运行代码ÿ…...
IDEA如何开启Dashboard
普通的面板 Run Dashboard面板 修改配置文件 找到项目的.idea文件夹 点击编辑workspace.xml文件 添加下方代码 <component name"RunDashboard"><option name"ruleStates"><list><RuleState><option name"name" valu…...
【论文复现】——一种新的鲁棒三维点云平面拟合方法
目录 一、算法原理1、论文概述2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的GPT爬虫。 一、算法原理 1、论文概述 针对三维点云中的异常值和粗差点对平面拟合精度产生的影响,文章提出一…...
【C语言】学生宿舍信息管理系统
目录 项目说明 1. 数据结构设计 2. 功能实现 3. 主菜单设计 4. 文件操作 5. 系统使用 项目展示 1.主菜单功能界面 编辑 2.添加信息 3.查询信息 4.修改信息 5.删除信息 6.退出程序 项目完整代码 结语 在这篇博客中,我们将探讨如何使用C语言来开发…...
用Python插入页码到PDF文档
页码是许多类型文件中的重要内容,它能方便读者在文档中的导航。在创建PDF文档时,添加页码对于组织和引用内容特别有用。在本文中,我们将探讨如何利用Python程序高效地插入页码到PDF文档中,简化工作流程并创建出精美、结构合理的PD…...
LabVIEW光偏振态转换及检测仿真系统
LabVIEW光偏振态转换及检测仿真系统 随着光学技术的发展,光偏振态的研究与应用越来越广泛。为了深入理解光的偏振现象,开发了一套基于LabVIEW的光偏振态转换及检测仿真系统。该系统不仅能够模拟线偏振光、圆偏振光、椭圆偏振光等不同偏振态的产生与转换…...
scp 本地机和远程机传输文件的方法
在本地机器上,通过ssh连接到远程机器,如果想要在两个机器之间互相传输文件,那么可以使用scp。 scp运行的地方:本地机的终端 样例: 1 将本地文件filename1传输到远程主机的/home/username/filename2目录下 scp -r D:\…...
自定义神经网络二之模型训练推理
文章目录 前言模型概念模型是什么?模型参数有哪些神经网络参数案例 为什么要生成模型模型的大小什么是大模型 模型的训练和推理模型训练训练概念训练过程训练过程中的一些概念 模型推理推理概念推理过程 总结 前言 自定义神经网络一之Tensor和神经网络 通过上一篇…...
Java设计模式:单例模式之六种实现方式详解(二)
在Java中,单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来获取该实例。单例模式在多种场景下都很有用,比如配置文件的读取、数据库连接池、线程池等。本文将详细介绍Java中实现单例模式的六种方…...
开创5G无线新应用:笙科电子5.8GHz 射频芯片
笙科电子(AMICCOM) 5.8GHz A5133射频芯片是一款专门设计用于在5.8GHz频率范围内(5725MHz - 5850MHz)进行射频信号处理的集成电路。这些集成电路通常包括各种功能模块,如射频前端、混合器、功率放大器、局部振荡器等,以支持无线通信系统的各种…...
使用 JMeter 生成测试数据对 MySQL 进行压力测试
博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
