代码随想录训练营day18

news/2024/4/28 17:23:52/文章来源:https://blog.csdn.net/chaizihao111/article/details/136974093

第六章 二叉树 part05

1.LeetCode.找树左下角的值

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

文章讲解:代码随想录
视频讲解:B站卡哥视频

1.2思路:本题要找出树的最后一行的最左边的值。此时大家应该想起用层序遍历是非常简单的了,反而用递归的话会比较难一点;如果使用递归法,如何判断是最后一行呢,其实就是深度最大的叶子节点一定是最后一行;那么如何找最左边的呢?可以使用前序遍历(当然中序,后序都可以,因为本题没有 中间节点的处理逻辑,只要左优先就行),保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。

1.3附加代码如下所示:

(1)递归法

//递归法 
class Solution {
public:int maxdepth=INT_MIN;int result;void traversal(TreeNode*node,int depth){//终止条件if(node->left==NULL&&node->right==NULL)//当遇到叶子节点的时候,就需要统计一下最大的深度了,所以需要遇到叶子节点来更新最大深度{if(depth>maxdepth){maxdepth=depth;result=node->val;}return;}if(node->left)//左{depth++;traversal(node->left,depth);depth--;//回溯}if(node->right)//右{depth++;traversal(node->right,depth);depth--;}return;}int findBottomLeftValue(TreeNode* root) {traversal(root,1);return result;}
};

(2)迭代法

//迭代法 层序遍历
class Solution {
public:int findBottomLeftValue(TreeNode* root) {queue<TreeNode*>que;if(root!=NULL)que.push(root);int result=0;while(!que.empty()){int size=que.size();for(int i=0;i<size;i++){TreeNode*node=que.front();que.pop();if(i==0)result=node->val;//一直遍历到最后一行的第一个节点就是二叉树的左下角的值if(node->left)que.push(node->left);if(node->right)que.push(node->right);}}return result;}
};

2.LeetCode. 路径总和

2.1题目链接:112. 路径总和

文章讲解:代码随想录
视频讲解:B站卡哥视频

2.2思路:可以使用深度优先遍历的方式(本题前中后序都可以,无所谓,因为中节点也没有处理逻辑)来遍历二叉树,

再来看返回值,递归函数什么时候需要返回值?什么时候不需要返回值?这里总结如下三点:

如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。(这种情况就是本文下半部分介绍的113.路径总和ii)

如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返回值。 (这种情况我们在236. 二叉树的最近公共祖先 (opens new window)中介绍)

如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,因为遇到符合条件的路径了就要及时返回。(本题的情况)

确定递归函数的参数和返回类型
参数:需要二叉树的根节点,还需要一个计数器,这个计数器用来计算二叉树的一条边之和是否正好是目标和,计数器为int型。
而本题我们要找一条符合条件的路径,所以递归函数需要返回值,及时返回,那么返回类型是什么呢?

如图所示:
在这里插入图片描述

2.3附加代码如下所示:

(1)路径总和

//迭代法
class Solution {
public:bool hasPathSum(TreeNode* root, int targetSum) {// 此时栈里要放的是pair<节点指针,路径数值>stack<pair<TreeNode*,int>>stk;//保存树的遍历节点,用pair<TreeNode*,int>及保存遍历的树节点又能吧遍历的路径数值之和存放起来if(root==NULL)return false;stk.push(pair<TreeNode*,int>(root,root->val));while(!stk.empty()){pair<TreeNode*,int> node=stk.top(); stk.pop();// 如果该节点是叶子节点了,同时该节点的路径数值等于sum,那么就返回trueif(node.first->left==NULL&&node.first->right==NULL&&targetSum==node.second){return true;}if(node.first->left)//左{stk.push(pair<TreeNode*,int>(node.first->left,node.second+node.first->left->val));}if(node.first->right)//右{stk.push(pair<TreeNode*,int>(node.first->right,node.second+node.first->right->val));}}return false;}
};
//递归法 
class Solution {
public:bool traversal(TreeNode*node,int count){//终止条件if(node->left==NULL&&node->right==NULL&&count==0){return true;}if(node->left==NULL&&node->right==NULL&&count!=0){return false;}if(node->left)//左{count-=node->left->val;if(traversal(node->left,count))return true;count+=node->left->val;}if(node->right)//右{count-=node->right->val;if(traversal(node->right,count))return true;count+=node->right->val;}return false;}bool hasPathSum(TreeNode* root, int targetSum) {if(root==NULL)return false;return traversal(root,targetSum-root->val);}
};

(2)路径总和Ⅱ

class Solution {
private:vector<vector<int>>result;vector<int>path;// 递归函数不需要返回值,因为我们要遍历整个树void traversal(TreeNode*node,int count){//终止条件if(node->left==NULL&&node->right==NULL&&count==0){result.push_back(path);return;}if(node->left==NULL&&node->right==NULL&&count!=0)return;if(node->left)//左{count-=node->left->val;path.push_back(node->left->val);traversal(node->left,count);count+=node->left->val;//计数值回溯path.pop_back();//路径节点值回溯}if(node->right)//右{count-=node->right->val;path.push_back(node->right->val);traversal(node->right,count);count+=node->right->val;//计数值回溯path.pop_back();//路径节点值回溯}}public:vector<vector<int>> pathSum(TreeNode* root, int targetSum) {result.clear();//如果Solution类的实例只被使用一次,那么这两行代码可以省略,因为result和path在每次创建Solution类的新实例时都会是空的。path.clear();//这两行代码是为了清楚之前调用该函数的执行结果if(root==NULL)return result;path.push_back(root->val);//把根节点放进去traversal(root,targetSum-root->val);return result;}
};

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

3.1题目链接:106.从中序与后序遍历序列构造二叉树

文章讲解:代码随想录
视频讲解:B站卡哥视频

3.2思路:以后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来再切后序数组。一层一层切下去,每次后序数组最后一个元素就是节点元素。注意采用前序遍历和后序遍历是不能得到完整二叉树的(具体可以自己画图一目了然)。

整体思路步骤:
说到一层一层切割,就应该想到了递归。

来看一下一共分几步:

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

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

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

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

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

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

3.3附加代码如下所示:

//递归法 
class Solution {
public:TreeNode*traversal(vector<int>& inorder, vector<int>& postorder){if(postorder.size()==0)return NULL;int rootvalue=postorder[postorder.size()-1];TreeNode*root=new TreeNode(rootvalue);//找到根节点int index;for(index=0;index<inorder.size();index++){if(inorder[index]==rootvalue)break;//找到中序数组切割点}//切割中序遍历数组为左中序和右中序vector<int>leftinorder(inorder.begin(),inorder.begin()+index);vector<int>rightinorder(inorder.begin()+index+1,inorder.end());postorder.resize(postorder.size()-1);//重新定义后续数组的大小,因为要把之前的根节点去掉//切割后序遍历数组为左后序和右后序vector<int>leftpostorder(postorder.begin(),postorder.begin()+leftinorder.size());vector<int>rightpostorder(postorder.begin()+leftinorder.size(),postorder.end());root->left=traversal(leftinorder,leftpostorder);//左子树root->right=traversal(rightinorder,rightpostorder);//右子树return root;}TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {if(postorder.size()==0||inorder.size()==0)return NULL;return  traversal(inorder,postorder);}
};

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

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

相关文章

24计算机考研调剂 | 【官方】北京科技大学

北京科技大学 考研调剂招生信息 招生专业&#xff1a; 085404&#xff08;计算机技术&#xff09; 081200&#xff08;计算机科学与技术&#xff09; 调剂要求&#xff1a;&#xff08;调剂基本分数&#xff09; 我中心将在教育部“全国硕士生招生调剂服务系统”&#xff08…

MRC是谁?- 媒体评级委员会 Media Rating Council

在在线广告的世界里&#xff0c;有许多不同的技术和实践用于提供和衡量广告。对于广告商、出版商和营销人员来说&#xff0c;了解这些技术是如何工作的以及如何有效使用这些技术很重要。在这方面发挥关键作用的一个组织是媒体评级委员会&#xff08;MRC&#xff09;。 1. 了解…

市场复盘总结 20240328

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率中 40% 最常用的…

C#手术麻醉系统源码 可对接HIS LIS PACS 医疗系统各类设备 医院手麻系统源码

C#手术麻醉系统源码 可对接HIS LIS PACS 医疗系统各类设备 手术麻醉信息管理系统主要还是为了手术室开发提供全面帮助的系统&#xff0c;其主要是由监护设备数据采集子系统和麻醉临床系统两个子部分组成。包括从手术申请到手术分配&#xff0c;再到术前访视、术中记录及术后…

并发编程之Callable方法的详细解析(带小案例)

Callable &#xff08;第三种线程实现方式&#xff09; Callable与Runnable的区别 Callable与Runnable的区别 实现方法名称不一样 有返回值 抛出了异常 ​class Thread1 implements Runnable{Overridepublic void run() { ​} } ​ class Thread2 implements Callable<…

软件推荐 篇三十七:安卓软件推荐IP Tools「IP工具」:全面解析网络状态与管理的必备神器

引言&#xff1a; 随着互联网的普及&#xff0c;网络已经成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;我们都需要通过网络来进行各种操作。然而&#xff0c;网络问题的出现往往会给我们带来诸多困扰。为了更好地管理和优化网络&#xff0c;我们…

虹科Pico汽车示波器 | 免拆诊断案例 | 2018款东风风神AX7车发动机怠速抖动、加速无力

一、故障现象 一辆2018款东风风神AX7车&#xff0c;搭载10UF01发动机&#xff0c;累计行驶里程约为5.3万km。该车因发动机怠速抖动、加速无力及发动机故障灯异常点亮而进厂维修&#xff0c;维修人员用故障检测仪检测&#xff0c;提示气缸3失火&#xff1b;与其他气缸对调点火线…

【Qt】使用Qt实现Web服务器(五):QtWebApp上传文件、详解请求数据处理过程

1、示例 1)演示 2)上传图片 3)显示图片 2、源码 示例源码Demo1->FileUploadController void FileUploadController::service(HttpRequest& request, HttpResponse& response)

快速幂算法在Java中的应用

引言&#xff1a; 在计算机科学和算法领域中&#xff0c;快速幂算法是一种用于高效计算幂运算的技术。在实际编程中&#xff0c;特别是在处理大数幂运算时&#xff0c;快速幂算法能够显著提高计算效率。本文将介绍如何在Java中实现快速幂算法&#xff0c;并给出一些示例代码和应…

Kubernetes 知识体系 系列一

多年前&#xff0c;大多数软件应用程序都是大型的单体&#xff0c;要么作为单个进程运行&#xff0c;要么作为少数服务器上的少量进程运行。这种过时的系统一直延续很久。 它们的发布周期较慢&#xff0c;更新相对较少。 在每个发布周期结束时&#xff0c;开发人员将整个系统…

2024最新华为OD机试试题库全 -【二叉树计算】- C卷

1. 🌈题目详情 1.1 ⚠️题目 给出一个二叉树如下图所示: 请由该二叉树生成一个新的二叉树,它满足其树中的每个节点将包含原始树中的左子树和右子树的和。 左子树表示该节点左侧叶子节点为根节点的一颗新树;右子树表示该节点右侧叶子节点为根节点的一颗新树。 1.2 �…

钡铼技术R40路由器助力构建无人值守的智能化污水处理厂

钡铼技术R40路由器作为智能化污水处理厂的关键网络设备&#xff0c;发挥着至关重要的作用&#xff0c;助力构建无人值守的智能化污水处理系统。在现代社会&#xff0c;污水处理是城市环境保护和可持续发展的重要组成部分&#xff0c;而智能化污水处理厂借助先进的技术和设备&am…

OPC560:打造智能制造领域的通讯桥梁

描述&#xff1a;随着工业4.0时代的到来&#xff0c;智能制造已成为推动工业发展的核心力量。在这一背景下&#xff0c;高效、稳定的数据通讯系统成为连接设备、平台和人员的关键。OPC560以其强大的功能和兼容性&#xff0c;为智能制造领域的数据通讯提供了全新解决方案。本文将…

幻兽帕鲁服务器价格表_阿里云/腾讯云/京东云/华为云报价大全

2024年全网最全的幻兽帕鲁服务器租用价格表&#xff0c;阿里云幻兽帕鲁游戏服务器26元1个月、腾讯云32元一个月、京东云26元一个月、华为云24元1个月&#xff0c;阿腾云atengyun.com整理最新幻兽帕鲁专用4核16G、8核16G、8核32G游戏服务器租用价格表大全&#xff1a; 阿里云幻…

极简wordpress网站模板

Pithy设计师wordpress网站模板 精练简洁的wordpress模板&#xff0c;设计师或设计工作室展示型网站模板。 https://www.jianzhanpress.com/?p6329

网络编程综合项目-多用户通信系统

文章目录 1.项目所用技术栈本项目使用了java基础&#xff0c;面向对象&#xff0c;集合&#xff0c;泛型&#xff0c;IO流&#xff0c;多线程&#xff0c;Tcp字节流编程的技术 2.通信系统整体分析主要思路&#xff08;自己理解&#xff09;1.如果不用多线程2.使用多线程3.对多线…

数据库管理开发工具Navicat for MySQL Mac版下载

Navicat for MySQL&#xff08;Mac版&#xff09;是一款强大的数据库管理开发工具&#xff0c;专为MySQL设计。它提供直观的用户界面&#xff0c;支持数据建模、查询构建、数据传输等功能&#xff0c;帮助用户轻松管理数据库。其特点包括高效的数据处理能力、安全的数据传输机制…

mysql80-DBA数据库学习1-数据库安装

掌握能力 核心技能 核心技能 mysql部署 官网地址www.mysql.com 或者www.oracle.com https://dev.mysql.com/downloads/repo/yum/ Install the RPM you downloaded for your system, for example: yum install mysql80-community-release-{platform}-{version-number}.noarch…

Flutter Provider 使用指南详解

介绍 在Flutter应用程序开发中&#xff0c;状态管理是一个至关重要的方面。随着应用程序的复杂性增加&#xff0c;有效地管理和共享状态变得至关重要。Flutter Provider是一个流行的状态管理解决方案&#xff0c;它提供了一种简单而强大的方式来管理Flutter应用程序中的状态。…

Web Components初探

组件化&#xff0c;标签语义化&#xff0c;是前端发展的趋势。现在流行的组件化框架有React、Vue等&#xff0c;标签语义化在H5中添加的article、dialog等。 Web Components 就是类似的一套技术&#xff0c;允许您创建可重用的定制元素&#xff0c;并且在您的web应用中使用它们…