代码随想录算法训练营第十八天| 513.找树左下角的值 ● 112. 路径总和 ● 106.从中序与后序遍历序列构造二叉树

层序遍历、回溯·、由两种遍历序列逆推二叉树

513.找树左下角的值

思路:
使用层序遍历,只需要记录最后一行第一个节点的数值就可以了。
特殊情况:

代码实现

class Solution {
public:int findBottomLeftValue(TreeNode* root) {int val;//利用队列先进先出实现层序遍历queue<TreeNode*> que;que.push(root);while(!que.empty()){TreeNode* temp;int size = que.size();for(int i = 0; i < size; i++){temp = que.front();que.pop();//每次for循环都遍历一层节点,从左到右遍历,故第一个是该层最左节点if(i == 0) val = temp->val;if(temp->left) que.push(temp->left);if(temp->right) que.push(temp->right);}}return val;}
};

112. 路径总和

思路:
前序遍历+回溯;
前序遍历是依次记录路径。
回溯使左右子树的遍历互不影响(目标值在递归到新一层时要减去当前节点的值,值传递方式实现回溯)。
路径的终点是叶子节点(左右子树均为空),当到达叶子节点时不等于0,则不存在
特殊情况:
注意主要有一条路径存在即可,所以用“

class Solution {
public:bool hasPathSum(TreeNode* root, int targetSum) {if(root == NULL) return false;targetSum -= root->val;if(targetSum == 0 && root->left == NULL && root->right == NULL) return true;return hasPathSum(root->left, targetSum) || hasPathSum(root->right, targetSum);}
};

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

思路:前、中、后序遍历即根节点在最前、中、最后被遍历访问。
根据两种顺序的特点来找到分割点
以后序数组的最后一个元素为切割点(根节点),先切中序数组,根据中序数组,反过来再切后序数组。一层一层切下去,每次后序数组最后一个元素就是节点元素。
步骤:
分几步:
● 第一步:如果数组大小为零的话,说明是空节点了。
● 第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。
● 第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点
● 第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)
● 第五步:切割后序数组,切成后序左数组和后序右数组
● 第六步:递归处理左区间和右区间
注意:
区间要统一,比如统一左闭右开

代码实现

class Solution {
public:TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {int size = postorder.size();if(size == 0) return nullptr;TreeNode* node = new TreeNode(postorder[size-1]);int index;for(index = 0; index < size; index++){if(inorder[index] == node->val) break;}vector<int> leftInorder = vector<int>(inorder.begin(),inorder.begin()+index);vector<int> rightPostorder = vector<int>(postorder.begin()+index,postorder.end()-1);vector<int> rightInorder = vector<int>(inorder.begin()+index+1,inorder.end());vector<int> leftPostorder = vector<int>(postorder.begin(),postorder.begin()+index);node->left = buildTree(leftInorder,leftPostorder);node->right = buildTree(rightInorder,rightPostorder);return node;}
};

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

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

相关文章

系统安全程序优化

我们为什么需要优化防火墙服务呢&#xff1f; 防火墙概念介绍&#xff1a; 防火墙作为本地计算机的一道防御&#xff0c;抵御着病毒、蠕虫、木马和强力的黑客攻击。 它既能以软件&#xff08;安全程序&#xff09;的形式出现&#xff0c;也可以采用硬件&#xff08;物理路由…

【Javaweb程序设计】【C00163】基于SSM房屋中介服务平台(论文+PPT)

基于SSM房屋中介服务平台&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的房屋中介服务平台 本系统分为前台、管理员、用户3个功能模块。 前台&#xff1a;当游客打开系统的网址后&#xff0c;首先看到的就是首页界面。…

【极数系列】Flink集成DataSource读取集合数据(07)

文章目录 01 引言02 简介概述03 基于集合读取数据3.1 集合创建数据流3.2 迭代器创建数据流3.3 给定对象创建数据流3.4 迭代并行器创建数据流3.5 基于时间间隔创建数据流3.6 自定义数据流 04 源码实战demo4.1 pom.xml依赖4.2 创建集合数据流作业4.3 运行结果日志 01 引言 源码地…

C语言-指针的基本知识(下)

四、指针的分类 按指针指向的数据的类型来分 1:字符指针 字符型数据的地址 char *p;//定义了一个字符指针变量&#xff0c;只能存放字符型数据的地址编号 char ch; p &ch; 2&#xff1a;短整型指针 short int *p;//定义了一个短整型的指针变量p&#xff0c…

怎样做好Code Review

Code Review方案 定义 Code Review代码评审是指在软件开发过程中&#xff0c;通过对源代码进行系统性检查的过程。通常的目的是查找各种缺陷&#xff0c;包括代码缺陷、功能实现问题、编码合理性、性能优化等&#xff1b;保证软件总体质量和提高开发者自身水平 code review …

【机器学习】正则化

正则化是防止模型过拟合的方法&#xff0c;它通过对模型的权重进行约束来控制模型的复杂度。 正则化在损失函数中引入模型复杂度指标&#xff0c;利用给W加权值&#xff0c;弱化了数据的噪声&#xff0c;一般不正则化b。 loss(y^,y)&#xff1a;模型中所有参数的损失函数&…

[论文阅读] |RAG评估_Retrieval-Augmented Generation Benchmark

写在前面 检索增强能够有效缓解大模型存在幻觉和知识时效性不足的问题&#xff0c;RAG通常包括文本切分、向量化入库、检索召回和答案生成等基本步骤。近期组里正在探索如何对RAG完整链路进行评估&#xff0c;辅助阶段性优化工作。上周先对评估综述进行了初步的扫描&#xff0…

mkcert的安装和使用,5分学会在本地开启localhost的https访问方式

mkcert官方仓库地址&#xff1a;https://github.com/FiloSottile/mkcert#installation mkcert 是一个简单的工具&#xff0c;用于制作本地信任的开发证书。它不需要配置。 简化我们在本地搭建 https 环境的复杂性&#xff0c;无需操作繁杂的 openssl 实现自签证书了&#xff…

docker笔记

容器技术 应用程序仅由较少数量的大组件构成时&#xff0c;可以给每个组件分配专用的虚拟机来隔离他们的环境。但是&#xff0c;组件更小&#xff0c;数量更多时&#xff0c;继续使用虚拟机来隔离得话&#xff0c;会浪费硬件资源&#xff0c;增加人力资源。 Linux容器技术隔离…

在WebSocket中使用Redis出现空指针异常解决方案

文章目录 在WebSocket中使用Redis1.问题描述2.原因3.解决步骤1.新建一个SpringUtil.java类&#xff0c;通过getBean的方法主动获取实例2.在WebSocketSingleServer.java中导入 在WebSocket中使用Redis 1.问题描述 在controller 和 service中都可以正常使用Redis&#xff0c;在…

xcode安装visionOS Simulator模拟器报错解决方法手动安装方法

手动安装方法&#xff1a; 手动下载visionOS Simulator模拟器地址&#xff1a; https://developer.apple.com/download/all/ 选择 Xcode 版本 sudo xcode-select -s /Applications/Xcode.app # 用 Xcode-beta 的话是&#xff1a; # xcode-select -s /Applications/Xcode-beta…

openssl3.2 - 测试程序的学习

文章目录 openssl3.2 - 测试程序的学习概述笔记openssl3.2 - 测试程序的学习 - 准备openssl测试专用工程的模板openssl3.2 - 测试程序的学习 - test\aborttest.copenssl3.2 - 测试程序的学习 - test\sanitytest.copenssl3.2 - 测试程序的学习 - test\acvp_test.copenssl3.2 - 测…

Python 编程技巧

在开发解决方案时&#xff0c;我们倾向于将复杂的实际问题提炼为更小、更易于管理的子问题&#xff0c;然后使用函数来解决这些问题。函数是冗余代码的克星&#xff0c;也是我们抵御代码复杂性的最强防线。 大多数函数在编写过程中&#xff0c;关键是其返回值。函数产生结果的…

邻接矩阵、关联矩阵

邻接矩阵&#xff1a; 邻接矩阵是一种用来表示图中顶点间相互连接关系的矩阵。在邻接矩阵中&#xff0c;矩阵的行和列都代表图中的顶点。 对于无权图&#xff0c;如果顶点 i 和顶点 j 之间有一条边&#xff0c;则矩阵中的元素 Aij​&#xff08;位于第 i 行和第 j 列&#xff…

编译Opencv3.3 版本遇到的Cuda版本变更导致:CUDA_nppicom_LIBRARY (ADVANCED)链接找不到的问题根本解法:

前言&#xff1a; Opencv 开源库的使用是必须的&#xff0c;但是&#xff0c;开源项目的特性&#xff0c;造成&#xff0c;版本的依赖性比较复杂&#xff0c; 尤其是针对某一款老硬件的SDK&#xff0c;往往随着某个开源库的使用&#xff0c;导致&#xff0c;无法编译的问题&am…

有一段时间没更新了

OK呀兄弟们&#xff0c;也是好久没更新了&#xff0c;这不是二级学完了&#xff0c;准备搞二级了吗&#xff0c;所以这两天我在做二级的往期考题&#xff0c;没发博客&#xff0c;请见谅&#xff0c;如果你们也在为等级考试做准备&#xff0c;那不妨去看看吧&#xff0c;往期考…

(bean的创建图)学习Spring的第十天(很重要)

大致框架按如下 第一次细分 bean对象还未创建 操作第一个map 引入BeanFactoryPostProcessor , 即Bean工厂后处理器 , 为Spring很重要的扩展点 BeanFactoryPostProcessor内部的方法 可以对BeaDefinition进行修改 , 也可进行BeanDefinition的注册 ( 原有在xml文件配置的bean…

AI之DL:人工智能领域—深度学习的发展历程之深度学习爆发的三大因素、探究DL为什么耗算力

AI之DL:人工智能领域—深度学习的发展历程之深度学习爆发的三大因素、探究DL为什么耗算力 目录 深度学习的发展历程之深度学习爆发的三大因素

从零学习Linux操作系统 第二十部分 mariadb数据库的管理

一、对于数据库的基本介绍 1.什么是数据库 数据库就是个高级的表格软件 2.常见数据库 Mysql Oracle mongodb db2 sqlite sqlserver … 3.Mysql (SUN -----> Oracle) 4.mariadb (Mysql的一种&#xff09; 数据库中的常用名词 1.字段 &#xff1a;表格中的表头 2.表 &…

Day01_变量和数据类型(注释,关键字,标识符,数据类型,字面量,变量,常量,进制,计算机存储单位,Java的基本数据类型的存储范围,计算机如何表示数据)

文章目录 JavaSE_Day01 变量和数据类型学习目标1.1 注释&#xff08;*comment*&#xff09;&#xff08;掌握&#xff09;1.2 关键字&#xff08;*keyword*&#xff09;&#xff08;掌握&#xff09;1.3 标识符( identifier)&#xff08;掌握&#xff09;1.3.1 标识符的命名规则…