算法打卡 Day20(二叉树)-找树左下角的值 + 路径总和 + 从中序与后序遍历序列构造二叉树

文章目录

  • Leetcode 513-找树左下角的值
    • 题目描述
    • 解题思路
  • Leetcode 112-路径总和
    • 题目描述
    • 解题思路
    • 相关题目
      • Leetcode 113-路径总和 ii
  • Leetcode 106-从中序与后序遍历序列构造二叉树
    • 题目描述
    • 解题思路
    • 类似题目
      • Leetcode 105-从前序与中序遍历序列构造二叉树

Leetcode 513-找树左下角的值

题目描述

https://leetcode.cn/problems/find-bottom-left-tree-value/

在这里插入图片描述

解题思路

我们要找的是深度最大的叶子节点

这道题用层序遍历相对更简单,层序遍历(迭代法)在遍历过程中记录最后一行的第一个节点的数值:

class Solution {
public:int findBottomLeftValue(TreeNode* root) {queue<TreeNode*> que;if (root != nullptr) 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;}
};

递归法:

class Solution {
public:int maxDepth = INT_MIN;//正确处理边界,保证当前最大深度对应的result正确更新int result;int tranversal(TreeNode* root, int depth) {if (root->left == nullptr && root->right == nullptr) {if (depth > maxDepth) {maxDepth = depth;result = root->val;}return 0;}if (root->left) {depth++;tranversal(root->left, depth);depth--;}if (root->right) {depth++;tranversal(root->right, depth);}return 0;}int findBottomLeftValue(TreeNode* root) {tranversal(root, 0);return result;}
};

Leetcode 112-路径总和

题目描述

https://leetcode.cn/problems/path-sum/description/

在这里插入图片描述

解题思路

采用递归的方法,在处理过程中没有对“中”的处理,因此本题中前中后序算法是类似的。

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

相关题目

Leetcode 113-路径总和 ii

https://leetcode.cn/problems/path-sum-ii/description/

在这里插入图片描述

class Solution {
private:vector<vector<int>>result;vector<int> temp;void tranversal(TreeNode* cur, int count) {if (cur->left == nullptr && cur->right == nullptr && count == 0) {result.push_back(temp);return;}if (cur->left == nullptr && cur->right == nullptr)return;if (cur->left) {//如果左节点不为空temp.push_back(cur->left->val);tranversal(cur->left, count - cur->left->val);temp.pop_back();}if (cur->right) {//如果右节点不为空temp.push_back(cur->right->val);tranversal(cur->right, count - cur->right->val);temp.pop_back();}return;}
public:vector<vector<int>> pathSum(TreeNode* root, int targetSum) {result.clear();temp.clear();if (root == nullptr)return result;temp.push_back(root->val);tranversal(root, targetSum - root->val);return result;}
};

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

题目描述

https://programmercarl.com/0106.%E4%BB%8E%E4%B8%AD%E5%BA%8F%E4%B8%8E%E5%90%8E%E5%BA%8F%E9%81%8D%E5%8E%86%E5%BA%8F%E5%88%97%E6%9E%84%E9%80%A0%E4%BA%8C%E5%8F%89%E6%A0%91.html

在这里插入图片描述

解题思路

后序最后一个节点是根节点,然后通过中序完成根节点左右节点的切割。之后的节点划分类似。

整体思路:

  1. 后序数组为 0,空节点;
  2. 后序数组最后一个元素为节点元素;
  3. 寻找中序数组位置作切割点;
  4. 切中序数组;
  5. 切后序数组;
  6. 递归处理左区间右区间
class Solution {
public:TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {if (postorder.size() == 0) return nullptr;//如果后序数组为空,说明根节点不存在,该二叉树为空int rootValue = postorder[postorder.size() - 1];//根节点是后序数组的最后一个TreeNode* root = new TreeNode((rootValue));//创建根节点if (postorder.size() == 1)return root;//如果仅存在一个节点,则该二叉树仅存在根节点(同时也是叶子节点)int index = 0;for (index; 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());//右中序int length = leftInorder.size();vector<int>leftPostorder(postorder.begin(), postorder.begin() + length);//左后序vector<int>rightPostorder(postorder.begin() + length, postorder.end() - 1);//右后序root->left = buildTree(leftInorder, leftPostorder);root->right = buildTree(rightInorder, rightPostorder);return root;}
};

类似题目

Leetcode 105-从前序与中序遍历序列构造二叉树

在这里插入图片描述

class Solution {
public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {if (preorder.size() == 0) return nullptr;int rootValue = preorder[0];TreeNode* root = new TreeNode(rootValue);if (preorder.size() == 1) return root;int index = 0;for (index; 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());//右中序int length = leftInorder.size();vector<int> leftPreorder(preorder.begin() + 1, preorder.begin() + 1 + length);//中左序vector<int> rightPreorder(preorder.begin() + 1 + length, preorder.end());//中右序root->left = buildTree(leftPreorder, leftInorder);root->right = buildTree(rightPreorder, rightInorder);return root;}
};

前面两道题分别考察了中序和前序、中序和后序确定构建二叉树,但后序和前序不能确定唯一的一棵二叉树,因为不能确定左右区间的分割点。

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

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

相关文章

HSL模型和HSB模型,和懒人配色的Color Hunt

色彩不仅仅是视觉上的享受&#xff0c;它在数据可视化中也扮演着关键角色。通过合理运用色彩模型&#xff0c;我们可以使数据更具可读性和解释性。在这篇文章将探讨HSL&#xff08;Hue, Saturation, Lightness&#xff09;和HSB&#xff08;Hue, Saturation, Brightness&#x…

Java中的抽象类与接口

1. 抽象类 1.1 抽象类概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c; 如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。 比如&…

freeRTOS学习之ARM架构

分析了arm架构以及RISC指令集的部分内容&#xff0c;同时复习了计算机组成原理中函数的汇编指令流程&#xff0c;也就是CPU的工作流程&#xff0c;大有裨益&#xff01;

【python】使用FastAPI开发文件下载和上传服务的详细分析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

如何使用Zoom API创建一个会议?

一、注册一个免费的Zoom账号&#xff08;zoom.us) 二、在Zoom 应用市场&#xff08;App Marketplace)创建一个server to server 的app&#xff0c;授予创建会议的权限。 三、创建一个Zoom API的服务端程序(node.js) 1、git clone https://github.com/zoom/server-to-server-o…

英语口语成人英语生活英语口语表达四六级英语培训柯桥小语种学习

全红婵向外国人展示金牌夺冠后&#xff0c;全红婵向外国友人展示金牌。视频中&#xff0c;一位外国男子对全红婵说&#xff1a;“How are you&#xff1f;”全红婵回应&#xff1a;“Good&#xff01;Good&#xff01;全红婵比出“拿捏”手势对方说全红婵是奥运冠军&#xff0c…

SpringCloud与SpringBoot之间的关系解析

Spring Cloud和Spring Boot是两个独立的项目&#xff0c;分别用于构建微服务架构和快速构建Java应用程序。它们之间有着密切的关系&#xff0c;可以相互配合使用。 Spring Boot简介 Spring Boot是一个用于快速构建Java应用程序的框架。它简化了Spring应用程序的开发过程&#x…

IDEA使用LiveTemplate快速生成方法注释

文章目录 1 场景2 要点2.1 新增LiveTemplate模版2.2 模版内容填写 3 练习手段 1 场景 方法的注释&#xff0c;一般包含作者、创建时间、功能描述、输入参数、返回值&#xff0c;如果每个方法的注释都手写&#xff0c;非常耗时&#xff0c;且容易随着后期变更代码导致差异&#…

Python酷库之旅-第三方库Pandas(075)

目录 一、用法精讲 306、pandas.Series.str.cat方法 306-1、语法 306-2、参数 306-3、功能 306-4、返回值 306-5、说明 306-6、用法 306-6-1、数据准备 306-6-2、代码示例 306-6-3、结果输出 307、pandas.Series.str.center方法 307-1、语法 307-2、参数 307-3、…

Python | Leetcode Python题解之第331题验证二叉树的前序序列化

题目&#xff1a; 题解&#xff1a; class Solution:def isValidSerialization(self, preorder: str) -> bool:pre 1for i in preorder.split(,):if i.isdigit():if pre 0:return Falsepre 1else:if pre 0:return Falsepre - 1return pre 0

GPS跟踪环路MATLAB之——数字锁频环

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 GPS跟踪环路MATLAB之——数字锁频环 前言为什么要锁频环科斯塔斯环鉴别器环路滤波器matlab程序获取完整程序 前言 从事卫星导航基带处理的童鞋都知道&#xff0c;跟踪环路属…

【DM】Linux下安装 DM数据库-命令行安装

【DM】Linux下安装 DM数据库-图形化安装 1、安装前准备工作1.1 检查 Linux系统信息1.2 创建DM安装用户1.3 检查操作系统限制1.4 检查系统内存与存储空间1.4.1 检查内存1.4.2 检查存储空间1.4.2 检查临时文件目录1.4.3 设置 JAVA 环境 2、使用dmdba用户安装DM82.1 挂载 DM 安装光…

vue中v-html 后端返回html + script js中click事件不生效

效果图&#xff1a; 需求&#xff1a;点击加号执行后端返回的script中的代码 后端返回的html&#xff1a; <!DOCTYPE html> <html langzh> <head> <title>xxx</title> <style>body{font-size: 14px}p{text-indent: 30px;}textarea{width…

华兮云创始人王正一——探索未来之路

在竞争激烈且机遇丛生的行业大环境中&#xff0c;我们有幸邀请到王正一走进直播间&#xff0c;开启一场关于破局与发展、理想与现实的深度交流。 当谈及在行业中应秉持何种心态时&#xff0c;王正一的见解独到且深刻。他强调&#xff0c;无论在融整产业中处于怎样的位置、扮演何…

【C++算法】双指针

移动零 题目链接&#xff1a;移动零https://leetcode.cn/problems/move-zeroes/description/ 算法原理 这类题是属于数组划分、数组分开题型 代码步骤&#xff1a; 使用cur遍历数组当cur所指的元素等于0时&#xff0c;cur向后面移动当cur所指的元素不等于0时&#xff0c;de…

JAVA—异常

认识异常&#xff0c;学会从报错信息中发现问题&#xff0c;解决问题。并学会构建自定义异常&#xff0c;提醒编程时注意 目录 1.认识异常 2.自定义异常 1.自定义运行时异常 2.自定义编译时异常 3.异常的处理 1.认识异常 异常就是代表程序出现的问题&#xff0c;用来查询B…

(自用)交互协议设计——protobuf序列化

protobuf是一种比json和xml等序列化工具更加轻量和高效的结构化数据存储格式&#xff0c;性能比json和xml真的强很多&#xff0c;毕竟google出品。 protobuf原理 protobuf如何使用 创建xxx.proto文件 开头写上 syntax"proto2"package tutorial; 表明使用的proto…

机器学习——支持向量机(SVM)(2)

目录 一、SVC理解进阶 1. C&#xff08;硬间隔与软间隔&#xff09; 2. class_weight 二、模型评估指标&#xff08;SVC&#xff09; 1. 混淆矩阵 &#xff08;Confusion Matrix&#xff09; &#xff08;1&#xff09;准确率 —— 模型整体效果 &#xff08;2&#xff…

Spring AI 更新:支持OpenAI的结构化输出,增强对JSON响应的支持

就在昨晚&#xff0c;Spring AI发了个比较重要的更新。 由于最近OpenAI推出了结构化输出的功能&#xff0c;可确保 AI 生成的响应严格遵守预定义的 JSON 模式。此功能显着提高了人工智能生成内容在现实应用中的可靠性和可用性。Spring AI 紧随其后&#xff0c;现在也可以对Open…

STM32CubleMX创建FreeRtos工程教程,图文教程

前言&#xff1a;STM32CubeMX 是一个开发工具&#xff0c;它已经将 FreeRTOS 这个实时操作系统&#xff08;RTOS&#xff09;集成到其工具中。换句话说&#xff0c;通过 STM32CubeMX&#xff0c;可以非常方便地为 STM32 微控制器生成配置代码&#xff0c;其中包括对 FreeRTOS 的…