【散刷】二叉树基础OJ题(三)

📝前言说明:
本专栏主要记录本人的基础算法学习以及刷题记录,使用语言为C++。
每道题我会给出LeetCode上的题号(如果有题号),题目,以及最后通过的代码。没有题号的题目大多来自牛客网。对于题目的讲解,主要是个人见解,如有不正确,欢迎指正,一起进步!

🎬个人简介:努力学习ing
📋本专栏:C++刷题专栏
📋其他专栏:C++学习笔记,C语言入门基础,python入门基础,python刷题专栏,Linux
🎀CSDN主页 愚润泽

题目

  • LCR 155. 将二叉搜索树转化为排序的双向链表
  • 105. 从前序与中序遍历序列构造二叉树
  • 106. 从中序与后序遍历序列构造二叉树
  • 144. 二叉树的前序遍历
  • 94. 二叉树的中序遍历
  • 145. 二叉树的后序遍历

LCR 155. 将二叉搜索树转化为排序的双向链表

题目链接:https://leetcode.cn/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof/description/
在这里插入图片描述

  • 中序遍历,得到的序列是有序的
  • 记录当前节点的前一个节点 prev
  • cur -> left = prev
  • 但是 cur -> right 要指向 nxt(下一个节点)
  • 我们可以让 cur 当上一层的下一个节点,然后让:pre -> right = cur
class Solution {
public:void dfs(Node* cur, Node* &prev) // 必须要按引用传递,要是全局的{if(!cur) return;dfs(cur->left, prev);cur->left = prev;if(prev)prev->right = cur;prev = cur;dfs(cur->right, prev);}Node* treeToDoublyList(Node* root) {if(root == nullptr) return nullptr;Node* prev = nullptr;dfs(root, prev);Node* tail = prev; // 遍历完 prev 就是尾节点,nullptr 是最后一个节点退出// 找到头节点(最左节点)Node* head = root;while (head->left) {head = head->left;}head->left = tail;tail->right = head;return head;}
};

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

题目链接:https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/
在这里插入图片描述

class Solution {
public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {// 通过前序确定根,然后找到中序根的位置,可以划分数的左右子树// 然后再对左右子树用同样的方法,得到构建好的左右子树// 递归时,子树的 preorder 和 inorder 的区间会改变)if(preorder.empty()) return nullptr;// 左子树的中序遍历序列的元素个数(同时也是先序遍历的, 因为左子树遍历完了才会遍历右子树)int left_size = ranges::find(inorder, preorder[0]) - inorder.begin();// 构造左子树的 preorder 和 inordervector<int> l_pre(preorder.begin() + 1, preorder.begin() + 1 + left_size);vector<int> l_ino(inorder.begin(), inorder.begin() + left_size);// 构造右子树的vector<int> r_pre(preorder.begin() + 1 + left_size, preorder.end());vector<int> r_ino(inorder.begin() + left_size + 1, inorder.end());TreeNode* left = buildTree(l_pre, l_ino); // 相信你把左子树构建好了TreeNode* right = buildTree(r_pre, r_ino);return new TreeNode(preorder[0], left, right); // 用当前的根节点 + 构建好的左右子树}
};
  • 注意好迭代器的起始和结束位置的选择(迭代器构造是左闭右开),注意要跳过根节点

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

题目链接:https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/
在这里插入图片描述

class Solution {
public:TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {int n = postorder.size();if(!n) return nullptr;int l_size = ranges::find(inorder, postorder[n - 1]) - inorder.begin();vector<int> l_pos(postorder.begin(), postorder.begin() + l_size);vector<int> l_ino(inorder.begin(), inorder.begin() + l_size);vector<int> r_pos(postorder.begin() + l_size, postorder.end() - 1);vector<int> r_ino(inorder.begin() + l_size + 1, inorder.end());TreeNode* left = buildTree(l_ino, l_pos);TreeNode* right = buildTree(r_ino, r_pos);return new TreeNode(postorder[n - 1], left, right);}
};

144. 二叉树的前序遍历

题目链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/description/
在这里插入图片描述

class Solution {
public:vector<int> ans;void dfs(TreeNode* root){if(!root) return;ans.push_back(root->val);dfs(root->left);dfs(root->right);}vector<int> preorderTraversal(TreeNode* root) {dfs(root);return ans;}
};

94. 二叉树的中序遍历

题目链接:https://leetcode.cn/problems/binary-tree-inorder-traversal/description/
在这里插入图片描述

class Solution {
public:vector<int> ans;void dfs(TreeNode* root){if(!root) return;dfs(root->left);ans.push_back(root->val);dfs(root->right);}vector<int> inorderTraversal(TreeNode* root) {dfs(root);return ans;}
};

145. 二叉树的后序遍历

题目链接:https://leetcode.cn/problems/binary-tree-postorder-traversal/description/
在这里插入图片描述

class Solution {
public:vector<int> ans;void dfs(TreeNode* root){if(!root) return;dfs(root->left);dfs(root->right);ans.push_back(root->val);}vector<int> postorderTraversal(TreeNode* root) {dfs(root);return ans;}
};

🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

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

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

相关文章

什么是数据交换?有哪些数据交换方式?

目录 一、数据交换是什么 二、数据交换面临的挑战 1. 数据格式差异 2. 数据标准不统一 3. 安全与隐私问题 4. 网络与性能问题 三、常见的数据交换方式 1. 文件交换 2. 数据库直连 3. 中间件交换 4. API接口交换 四、数据交换的发展趋势 1. 实时性要求提高 2. 标准…

C#winform画图代码记录

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 坐标变换 {public partial class Fo…

python打卡day50

import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pyplot as plt import numpy as np# 定义通道注意力 class ChannelAttention(nn.Module):def __i…

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…

ateⅹⅰt()的用法

在C/C++中, atexit() 函数用于注册程序退出时需要调用的函数,即使程序通过 main() 函数返回、 exit() 函数退出或异常终止,这些注册的函数也会被执行。以下是其详细用法: 1. 函数原型与头文件 #include <cstdlib> // C++中需包含此头文件 int atexit(void (*functio…

【大模型】 使用llama.cpp 进行模型转换和量化

目录 1 相关知识 ■llama.cpp ■GGUF 格式 ■量化 2 详细步骤 克隆 llama.cpp 仓库 安装依赖 配置 CMake 构建 构建项目 验证安装 转换 safetensors 为 FP16 GGUF 量化模型 (Q4_K_M) 测试量化模型 1 相关知识 ■llama.cpp llama.cpp是一个开源的 C/C++ 库,旨…

大数据学习(133)-Hive数据分析2

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…

IDEA 连接 Docker 一键打镜像

首先&#xff0c;检查 IDEA 是否安装了 Docker 插件&#xff1a; 版本比较新的 IDEA 默认都安装了这个插件&#xff0c;如果没有安装&#xff0c;安装一下。 确保我们虚拟机上安装了 Docker 和 Docker-compose&#xff0c;并启动了 Docker。 找到 IDEA 下方的 Services tab 栏…

第六讲——一元函数微分学的应用之中值定理、微分等式与微分不等式

文章目录 连续函数性质定理定理1 有界与最值定理定理2 介值定理定理3 平均值定理定理4 零点定理定理5 费马定理导数介值定理(达布定理) 中值定理罗尔定理拉格朗日中值定理柯西中值定理泰勒公式 讨论方程的根问题——微分等式证明不等式问题使用函数的性质(单调性、凹凸性、最值…

2025.06.11【Ribo-seq】|用CPAT预测sORF序列的编码潜能

文章目录 前言一、准备工作1. 安装CPAT2. 下载物种特异性模型 二、准备sORF核酸序列1. 获取sORF的拼接核酸序列示例脚本&#xff08;假设已获得外显子fasta&#xff09;&#xff1a; 三、运行CPAT预测编码潜能1. 准备CPAT模型和hexamer表2. 运行CPAT 四、结果解读五、常见问题与…

Hive面试题汇总

一、hive架构相关 遇到这类问题&#xff0c;可以灵活的去回答&#xff0c;比如可以结合平时使用hive的经验作答&#xff0c;也可以结合下图从数据的读入、解析、元数据的管理&#xff0c;数据的存储等角度回答&#xff1a; 二、hive的特点 本题主要为了考察对hive的整体使用…

树莓派超全系列教程文档--(57)如何设置 Apache web 服务器

如何设置 Apache web 服务器 设置 Apache web 服务器安装 Apache测试 web 服务器更改默认网页 为 Apache 安装 PHP 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 设置 Apache web 服务器 Apache 是一款流行的 web 服务器应用程序&#xff0c;您…

(九)现代循环神经网络(RNN):从注意力增强到神经架构搜索的深度学习演进

现代循环神经网络的内容&#xff0c;将介绍几种先进的循环神经网络架构&#xff0c;包括门控循环单元&#xff08;GRU&#xff09;、长短期记忆网络&#xff08;LSTM&#xff09;的变体&#xff0c;以及注意力机制等。这些内容将帮助你更深入地理解循环神经网络的发展和应用。 …

牛市与熊市:市场周期的双面镜

牛市推动资产增值与风险积累&#xff0c;熊市挤压泡沫并孕育机会&#xff0c;两者交替循环&#xff0c;构成市场自我调节机制。 1、概念对比&#xff1a;情绪与趋势的博弈 牛市&#xff08;Bull Market&#xff09;&#xff1a;指资产价格持续上涨&#xff08;通常涨幅超20%&a…

web程序设计期末复习-填空题

常用标签 块级标记 行内标记等 一、块级元素 特点&#xff1a; 独占一行可以设置宽度、高度、内外边距默认情况下会从上到下垂直排列 常见标签&#xff1a; 标签 含义 <div> 最常用的通用块级容器 <p> 段落 <h1>到<h6> 标题&#xff08;一级…

go全局配置redis,全局只需要连接一次,然后全局可以引用使用

创建redis文件夹、创建dadeRedis.go package redisimport ("context""github.com/go-redis/redis/v8""log""time" )var (client *redis.Clientctx context.Background() )// 初始化Redis连接&#xff08;建议在程序启动时调用&am…

缓冲区(C语言缓冲区+内核缓冲区)一个例子解释他们的关系和作用!!!

首先提出问题&#xff1a; 为什么以下代码是先sleep三秒后&#xff0c;屏幕才显示"XXXXXXX"。 #include<stdio.h> #include<unistd.h>int main() {printf("XXXXXXX");sleep(3);return 0; } 为什么以下代码是先显示"XXXXXXX"&#xf…

【2025版】Java 工程师学习路线图 —— 掌握程度描述版

✅【2025版】Java 工程师学习路线图 &#x1f4a1; 目标&#xff1a;成为合格的 Java 工程师&#xff08;前后端都要会&#xff09; &#x1f4dd; 结构清晰 | 阶段明确 | 掌握程度分级 | 适合自学或转行 &#x1f539; 阶段一&#xff1a;编程基础 计算机通识 模块内容推荐掌…

从零实现一个红队智能体

从零实现一个红队智能体(持续更新) 2025-06-09 背景&#xff1a;最近学了基础些东西和工具基础使用&#xff0c;发现一套流程下来太多需要手工要做的&#xff0c;就像自己能不能结合自己的技术栈实现小工具 &#x1f947; 第一步&#xff1a;从实用性开始分析 目标场景 希望…

Uniapp实现多选下拉框

文章目录 前言一、效果展示1.1 下拉效果图1.2 下拉选择效果图1.3 选择显示效果图 二、组件源码2.1.CustomCheckbox.vue源码2.2.niceui-popup-select.vue源码 三、demo.vue代码演示 前言 之前在使用Uniapp时&#xff0c;一直都是下拉框单选。今天某个项目需求需要使用Uniapp实现…