代码随想录刷题题Day19

刷题的第十九天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀
刷题语言:C++
Day19 任务
● 669. 修剪二叉搜索树
● 108.将有序数组转换为二叉搜索树
● 538.把二叉搜索树转换为累加树

1 修剪二叉搜索树

669. 修剪二叉搜索树
在这里插入图片描述

在这里插入图片描述
递归法
(1)确定递归函数的参数以及返回值

TreeNode* trimBST(TreeNode* root, int low, int high)

(2)确定终止条件

if (root == NULL) return NULL;

(3)确定单层递归的逻辑

如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点

if (root->val < low) {TreeNode* right = trimBST(root->right, low, high);// 寻找符合区间[low, high]的节点return right;
}

如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。

if (root->val > high) {TreeNode* left = trimBST(root->left, low, high);// 寻找符合区间[low, high]的节点return left;
}

将下一层处理完左子树的结果赋给root->left,处理完右子树的结果赋给root->right。最后返回root节点

root->left = trimBST(root->left, low, high); // root->left接入符合条件的左孩子
root->right = trimBST(root->right, low, high); // root->right接入符合条件的右孩子
return root;

C++:

class Solution {
public:TreeNode* trimBST(TreeNode* root, int low, int high) {if (root == NULL) return NULL;if (root->val < low) {return trimBST(root->right, low, high);}if (root->val > high) {return trimBST(root->left, low, high);}root->left = trimBST(root->left, low, high);root->right = trimBST(root->right, low, high);return root;}
};

2 将有序数组转换为二叉搜索树

108.将有序数组转换为二叉搜索树
在这里插入图片描述
思路:

本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间

在这里插入图片描述
如果要分割的数组长度为偶数的时候,中间元素为两个,是取左边元素 就是树1,取右边元素就是树2。
递归法
(1)确定递归函数返回值及其参数
参数:数组、左下标left、右下标right
返回值:TreeNode*

// 左闭右闭区间[left, right]
TreeNode* traversal(vector<int>& nums, int left, int right)

定义的是左闭右闭区间,在不断分割的过程中,也会坚持左闭右闭的区间(循环不变量)
(2)确定递归终止条件

if (left > right) return NULL;

(3)确定单层递归的逻辑

  1. 取数组中间元素的位置
  2. 以中间位置的元素构造节点
  3. 划分区间,root的左孩子接住下一层左区间的构造节点,右孩子接住下一层右区间构造的节点。
  4. 最后返回root节点
int mid = left + ((right - left) / 2);
TreeNode* root = new TreeNode(nums[mid]);
root->left = traversal(nums, left, mid - 1);
root->right = traversal(nums, mid + 1, right);
return root;

C++:

class Solution {
public:TreeNode* traversal(vector<int>& nums, int left, int right) {if (left > right) return NULL;int mid = (left + right) / 2;TreeNode* root = new TreeNode(nums[mid]);root->left = traversal(nums, left, mid - 1);root->right = traversal(nums, mid + 1, right);return root;}TreeNode* sortedArrayToBST(vector<int>& nums) {return traversal(nums, 0, nums.size() - 1);}
};

3 把二叉搜索树转换为累加树

538.把二叉搜索树转换为累加树
在这里插入图片描述
思路:

二叉搜索树有序,中序遍历(左中右)得到有序数组,将有序数组向前累加:右中左
反中序遍历这个二叉树,然后顺序累加

递归法
在这里插入图片描述
需要一个pre记录当前遍历节点cur的前一个节点的值,方便做累加。
(1)递归函数参数以及返回值
参数:当前节点
返回值:void

int pre = 0;// 记录前一个节点的数值
void traversal(TreeNode* cur)

(2)确定终止条件:遇空就终止

if (cur == NULL) return;

(3)确定单层递归的逻辑

右中左来遍历二叉树

traversal(cur->right);// 右
cur->val += pre;      // 中
pre = cur->val;
traversal(cur->left); // 左

C++:

class Solution {
public:int pre = 0;// 记录前一个节点的数值void traversal(TreeNode* cur) {// 右中左遍历if (cur == NULL) return;traversal(cur->right);cur->val += pre;pre = cur->val;traversal(cur->left);}TreeNode* convertBST(TreeNode* root) {traversal(root);return root;}
};

鼓励坚持二十天的自己😀😀😀

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

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

相关文章

数据库编程大赛:一条SQL计算扑克牌24点

你是否在寻找一个平台&#xff0c;能让你展示你的SQL技能&#xff0c;与同行们一较高下&#xff1f;你是否渴望在实战中提升你的SQL水平&#xff0c;开阔你的技术视野&#xff1f;如果你对这些都感兴趣&#xff0c;那么本次由NineData主办的《数据库编程大赛》&#xff0c;将是…

Leetcode 406 根据身高重建队列

题意理解&#xff1a; people [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]] 给定一个二维数组&#xff0c;&#xff08;h,k&#xff09;h表示此人身高&#xff0c;k表示前面有几个人比他高。 我们按照每个人的h,k两个维度的需求给每个人排在合适的位置。 如&#xff1a; [5,0][7,0]…

docker数据卷数据卷容器

前言 今天调休在家&#xff0c;随便玩玩&#xff0c;简单做下学习记录 1. 数据卷特点 数据卷在容器启动时初始化&#xff0c;如果容器使用的镜像在挂载点包含了数据&#xff0c;这些数据会被拷贝到新初始化的数据卷中数据卷可以在容器之间共享和重用可以对数据卷里的内容直接…

3. BlazorSignalRApp 结合使用 ASP.NET Core SignalR 和 Blazor

参考&#xff1a;https://learn.microsoft.com/zh-cn/aspnet/core/blazor/tutorials/signalr-blazor?viewaspnetcore-8.0&tabsvisual-studio 1.创建新项目 BlazorSignalRApp 2.添加项目依赖项 依赖项&#xff1a;Microsoft.AspNetCore.SignalR.Client 方式1 管理解决方案…

利用老毛桃、ultraiso软碟通制作启动U盘装系统 以及硬盘安装系统

目录 一. 老毛桃制作winPE镜像 1.1 准备工作 1.2 启动U盘制作步骤 1.3 启动U盘装系统 二. 使用ultraiso软碟通制作启动U盘 2.1 启动U盘制作步骤 2.2 启动U盘装系统 三. 硬盘安装系统 3.1 硬盘镜像制作步骤 3.2 硬盘镜像装系统 思维导图 一. 老毛桃制作winPE镜像 …

网络编程:信号、定时器、Libevent

1. 信号 &#xff08;1&#xff09;信号&#xff1a;由用户、系统或进程发送给目标进程的信息&#xff0c;以通知目标进程某个状态的改变或系统异常&#xff1b; 可由下述条件产生&#xff1a; 对前台进程&#xff0c;用户可以通过终端给它发送信号&#xff0c;如输入 CtrlC…

c++ qt 模态框和阻拦器 优先级 问题 修复 已解决

在c项目中。有 加载动画 和 模态框提醒的功能, 导致发生一个问题&#xff0c;有提示框的时候&#xff0c;动画也停止&#xff0c;必须点击 按钮 所有代码才能有效。 解决办法 谨慎使用 deleteLater,因为和模态框拦截有冲突, 使用 隐藏 或者 删除指针。 deleteLater 使用逻辑是 …

融资项目——vue之双向数据绑定

上一篇文章中使用的v-bind是单向绑定方法&#xff0c;即数据改变&#xff0c;网页相应的视图发生改变&#xff0c;但是网页视图发生改变其相关联的数据不会发生改变。但是双向数据绑定不同之处在于网页视图发生改变其相关联的数据也会发生改变。Vue可以使用v-model进行双向数据…

振动试验的工装夹具(GB/T 2423.43-2008)

但当试件体积较大&#xff0c;而且形状复杂时&#xff0c;这种固定方法显然很困难&#xff0c;这时需要制作夹具&#xff0c;让试件安装在夹具上然后把夹具牢固地固定在振动台面上&#xff0c;因此实际上夹具是试件与振动台面连接的过渡体&#xff0c;其功能是将振动台的振动和…

实在智能成功完成近2亿元C轮融资,全面迎接2024年Agent智能体应用元年

在这个最冷的季节&#xff0c;杭州实在智能科技有限公司&#xff08;以下简称“实在智能”&#xff09;依然表现火爆&#xff0c;近日&#xff0c;实在智能成功完成C轮融资近2亿元人民币&#xff0c;由金泰富资本和安吉智慧谷共同领投、安吉两山国创跟投。 在此轮融资以前&…

数据结构 | 北京大学期末试卷查漏补缺

目录 顺序存储 优点 缺点 适用于&#xff1a; 链式存储 优点 缺点 适用于&#xff1a; 折半查找为什么要使用顺序存储结构 树的存储结构​编辑 对于一个数据结构&#xff0c;一般包括 DFS&BFS 什么是递归程序 C语言不带头结点的单链表逆置 检测字符…

DMA实验3-外设到内存搬运

实验要求 使用 DMA 的方式将串口接收缓存寄存器的值搬运到内存中&#xff0c;同时闪烁 LED1 。 CubeMX 配置 DMA 配置&#xff1a; 串口中断配置 代码实现 如何判断串口接收是否完成&#xff1f;如何知道串口收到数据的长度&#xff1f; 使用串口空闲中断&#xff08;IDL…