Studying-代码随想录训练营day21| 669.修建二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树、二叉树总结

第21天,二叉树最后一篇,冲💪

目录

669.修建二叉搜索树

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

538.把二叉搜索树转换为累加树

二叉树总结


669.修建二叉搜索树

文档讲解:代码随想录修建二叉搜索树

视频讲解:手撕修建二叉搜索树

题目:

学习:

本题需要注意的点很多,不能够轻易的就把节点删除,首先:1.本题给出的最小边界值和最大边界值,不一定会存在树中,只是提供一个区间大小,因此不能够节点判断是否等于low或者high。2.在找到小于low的值后不能够直接将其删除,因为它的右孩子不一定小于low,同理大于high的节点也不能直接删除,还需要关注它的左孩子。3.在2的基础上,也不能直接把右孩子返回,因为右孩子大于low的情况下,右孩子的左孩子还是可能会小于low需要删除,因此还需要不断的进行遍历。(该情况如下图所示,如果区间在[2,3]之间)

依据上述所说,来设计递归三部曲。

代码:

//时间复杂度O(n)
//空间复杂度O(n)
class Solution {
public://确定返回值,本题需要重新构造二叉树节点,因此使用返回值更加方便,当然也可以没有返回值就需要手动进行左右孩子构造TreeNode* trimBST(TreeNode* root, int low, int high) {//确定终止条件if (root == nullptr) return nullptr;//确定单层递归逻辑(核心是将root转移到low和high区间内)//1.当前值大于highif (root->val > high) {//在该节点左边找寻是否有合适的值return trimBST(root->left, low, high);}//2.当前值小于lowif (root->val < low) {//在该节点右边找寻是否有合适的值return trimBST(root->right, low, high);}//3.当前值在low和high区间内,但是还不能就此下定义,还需要判断该节点左右孩子是否合格root->left = trimBST(root->left, low, high);root->right = trimBST(root->right, low, high);//持续把修改后的节点返回上层return root;}
};

代码:本题也能够使用迭代法,且由于二叉搜索树自带遍历条件,因此不需要额外空间。

//时间复杂度O(n)
//空间复杂度O(1)
class Solution {
public:TreeNode* trimBST(TreeNode* root, int L, int R) {if (!root) return nullptr;// 处理头结点,让root移动到[L, R] 范围内,注意是左闭右闭while (root != nullptr && (root->val < L || root->val > R)) {if (root->val < L) root = root->right; // 小于L往右走else root = root->left; // 大于R往左走}TreeNode *cur = root;// 此时root已经在[L, R] 范围内,处理左孩子元素小于L的情况while (cur != nullptr) {while (cur->left && cur->left->val < L) {cur->left = cur->left->right;}cur = cur->left;}cur = root;// 此时root已经在[L, R] 范围内,处理右孩子大于R的情况while (cur != nullptr) {while (cur->right && cur->right->val > R) {cur->right = cur->right->left;}cur = cur->right;}return root;}
};

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

文档讲解:代码随想录将有序数组转换为二叉搜索树

视频讲解:手撕将有序数组转换为二叉搜索树

题目:

学习:

注意本题需要构造的不仅是二叉搜索树还需要是一颗平衡二叉树。平衡二叉树需要所有中间节点的左右孩子的高度差不大于1。

依据上述条件,又因为本题给的数组已经是一个升序排列的数组了,因此本题显然是从中间节点进行构造,每次取数组的中间节点,即可构造出平衡的二叉搜索树。注意如果数组是奇数,显然选中间的节点,如果数组是偶数则中间的两个节点选哪个都可以,只要统一就行,最后构造出的二叉树会有所区别,这也是本题答案不唯一的原因。

代码:

//时间复杂度O(n)
//空间复杂度O(n^2)
class Solution {
public:TreeNode* sortedArrayToBST(vector<int>& nums) {//确定终止条件if(nums.size() == 0) return nullptr;//取中间值int mid = nums.size()/2;TreeNode* node = new  TreeNode(nums[mid]);//左区间vector<int> left(nums.begin(), nums.begin() + mid);//右区间vector<int> right(nums.begin() + mid + 1, nums.end());//分配左右子树node->left = sortedArrayToBST(left);node->right = sortedArrayToBST(right);return node;}
};

代码:不使用额外空间,下标确定数组区间

//时间复杂度O(n)
//空间复杂度O(n)递归产生的栈空间
class Solution {
public://不使用额外空间,下标法TreeNode* traversal(vector<int>& nums, int left, int right) {//确定终止条件(区间左闭右闭)if(left > right) return nullptr;//找到中间值int mid = left + (right - left)/2; //防止数值越界TreeNode* node = new TreeNode(nums[mid]);//左区间node->left = traversal(nums, left, mid - 1);//右区间node->right = traversal(nums, mid + 1, right);return node;}TreeNode* sortedArrayToBST(vector<int>& nums) {return traversal(nums, 0, nums.size() - 1);}
};

538.把二叉搜索树转换为累加树

文档讲解:代码随想录把二叉搜索树转换为累加树

视频讲解:手撕把二叉搜索树转换为累加树

题目:

学习:本题最重要的是需要找到它的规律,本题是将每个节点的新值转变为等于原树中大于或等于node.val的值之和。如果将二叉搜索树通过中序遍历转化为数组来看的话,其实就是从后往前依次累加。因此本题应该采用的遍历方法是反中序遍历,通过右中左的遍历顺序,因此将节点值累加。

注意本题累加过程中,采用的是双指针的方法,需要一个指向当前节点的前一个节点pre来保存上一个节点的累加和。

代码:

//时间复杂度O(n)
//空间复杂度O(n)
class Solution {
public:TreeNode* pre = nullptr; //指向当前节点的前一个节点//本题不需要返回值,只用将当前值改变就行void traversal(TreeNode* root) {//终止条件if(root == nullptr) return;//本题的遍历顺序应该为右中左//右traversal(root->right);//中if(pre != nullptr) {root->val = root->val + pre->val;}pre = root;//左traversal(root->left);}TreeNode* convertBST(TreeNode* root) {traversal(root);return root;}
};

代码:本题也能够使用迭代法进行

//时间复杂度O(n)
//空间复杂度O(n)
class Solution {
private:int pre; // 记录前一个节点的数值void traversal(TreeNode* root) {stack<TreeNode*> st;TreeNode* cur = root;while (cur != NULL || !st.empty()) {if (cur != NULL) {st.push(cur);cur = cur->right;   // 右} else {cur = st.top();     // 中st.pop();cur->val += pre;pre = cur->val;cur = cur->left;    // 左}}}
public:TreeNode* convertBST(TreeNode* root) {pre = 0;traversal(root);return root;}
};

二叉树总结

对于二叉树来说我们首先需要掌握的就是递归这一算法,确定递归三部曲掌握通过递归进行的二叉树的前序遍历、中序遍历、后序遍历的方法。

其次对于二叉树来说,它的迭代方法同样也很重要,递归由于其不断递归的特殊性,稍有不慎就容易导致栈溢出,且问题相对于迭代法不好排查。因此掌握迭代法对于实际工程使用也十分重要。

这七天我们对二叉树的遍历方式,各种属性,二叉树的修改和构造都进行了详细的练习。并且对二叉树中一个重要的类型二叉搜索树也进行了详细的考察,二叉搜索树自带的遍历顺序,能够便于解答很多问题,同时对二叉搜索树进行中序遍历能够得到一个非递减序列也是重要的性质之一。

总结来说:

  • 涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定都是先构造中节点。

  • 求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。(包括是否对称,求最大深度,最小深度,有多少个节点,是否平衡,路径问题,左叶子之和、左下角的值等)

  • 求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。

 二叉树系列就这么完美结束了!

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

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

相关文章

API-元素尺寸与位置

学习目标&#xff1a; 掌握元素尺寸与位置 学习内容&#xff1a; 元素尺寸与位置仿京东固定导航栏案例实现bilibili点击小滑块移动效果 元素尺寸与位置&#xff1a; 使用场景&#xff1a; 前面案例滚动多少距离&#xff0c;都是我们自己算的&#xff0c;最好是页面滚动到某个…

[leetcode]圆圈中最后剩下的数字/ 破冰游戏

. - 力扣&#xff08;LeetCode&#xff09; class Solution {int f(int num, int target) {if (num 1) {return 0;}int x f(num - 1, target);return (target x) % num;} public:int iceBreakingGame(int num, int target) {return f(num, target);} };

程序猿大战Python——Python与MySQL交互一

pymysql模块的安装 目标&#xff1a;了解如何安装pymysql模块&#xff1f; 当要使用Python和MySQL数据库进行交互&#xff0c;需要借助一个第三方模块&#xff1a;pymysql。 在使用pymysql模块前&#xff0c;先进行安装&#xff1a; pip install pymysql 有时使用pip instal…

从零开始做题:有手就行

1 题目 2 解题 ARPHCR工具破解 得到flag DASCTF{2b3767763885a019b65bbfe9d1136c3b}

数据结构与算法笔记:高级篇 - 向量空间:如何实现一个简单的音乐推荐系统?

概述 很多人喜都喜爱听歌&#xff0c;以前我们用 MP3 听歌&#xff0c;现在直接通过音乐 App 在线就能听歌。而且&#xff0c;各种音乐 App 的功能越来越强大&#xff0c;不仅可以自己选歌听&#xff0c;还可以根据你听歌的喜好&#xff0c;给你推荐你可能会喜好的音乐&#x…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第49课-机器人自动跳舞

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第49课-机器人自动跳舞 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎…

DevExpress Office File API教程 - 如何使用AI服务增强Word文档可访问性和语言支持?

DevExpress Office File API是一个专为C#, VB.NET 和 ASP.NET等开发人员提供的非可视化.NET库。有了这个库&#xff0c;不用安装Microsoft Office&#xff0c;就可以完全自动处理Excel、Word等文档。开发人员使用一个非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CS…

使用隐式事件执行控制图

什么是隐式事件&#xff1f; 隐式事件是图表执行时发生的内置事件&#xff1a; 图表唤醒 进入一个状态 退出状态 分配给内部数据对象的值 这些事件是隐式的&#xff0c;因为您没有显式地定义或触发它们。隐式事件是它们发生的图表的子级&#xff0c;仅在父图表中可见。 隐式事…

Embedding的概念和展开

前言 本章&#xff0c;我们介绍一个非常细的细节技术。让我们微调大模型的一些特性和能力。 在大模型的AI套路演化过程中&#xff0c;其实经历了太多的技术革新和方式变化&#xff0c;Embedding其实也可能是其中一个高速湮灭的技术点之一。 对比LoRA现在大红大紫&#xff0c…

每个 Node.js 开发人员都应该知道的13个库(下)

7. Sequelize Mongoose是一个Node。基于js的MongoDB对象建模工具&#xff0c;通常被称为对象数据建模&#xff08;ODM&#xff09;库&#xff0c;它提供了诸如钩子、模型验证、连接和查询等功能。 Mongoose为应用程序数据提供了一个基于模式的解决方案&#xff0c;它在应用程…

论文翻译 | ITER-RETGEN:利用迭代检索生成协同增强检索增强的大型语言模型

论文地址&#xff1a;Enhancing Retrieval-Augmented Large Language Models with Iterative Retrieval-Generation Synergy 摘要 检索增强生成由于有望解决包括过时知识和幻觉在内的大型语言模型的局限性而引起广泛关注。然而&#xff0c;检索器很难捕捉相关性&#xff0c;尤…

BurpSuite2024.5.3专业版,仅支持Java21以上

01更新介绍 此版本引入了对 WebSocket 的 Burp Scanner 支持、对录制的登录编辑器的改进、WebSocket 匹配和替换规则以及许多性能改进。我们还删除了一些冗余的扫描检查。 Burp Scanner 对 WebSockets 的支持我们更新了内部代理的配置&#xff0c;以允许 WebSocket 流量。这使…

将产品制作成3D模型在网站上展示需要多少费用?

将产品制作成3D模型并在网站上展示的费用会因多种因素而异&#xff0c;包括模型的复杂度、所需的细节程度、制作3D模型的软件和工具、以及是否需要专业设计师的服务等。此外&#xff0c;不同的3D模型制作服务提供商可能会有不同的定价标准。 如果能自己制作3D模型&#xff0c;…

友力科技IDC机房搬迁方案流程分享

机房搬迁流程 系统搬迁实施流程包括&#xff1a;准备、拆卸、装运、安装、调试等五个流程&#xff0c;具体如下&#xff1a; 准备:包括相关人员和设备准备、新机房环境准备、网络环境、备份、现场所有设备打标签、模块、设备准备等准备工作。拆卸&#xff1a;主要只核心设备下…

iptables(2)安装及规则查询

安装iptables 我是用的系统是debian 12,目前没有安装iptables。 防火墙已经安装完成了 iptables 的配置语法 iptables (选项) (参数) # 通用匹配:源地址目标地址的匹配 -p:指定要匹配的数据包协议类型 -s, --source [!] address[/mask] :把指定的一个/一组地址作为源地…

防坑知识:如果要查自己的大数据信用报告,这几种平台一定不要选!

很多小伙伴在候遇到申贷碰壁&#xff0c;特别是被告知原因是大数据不良之后&#xff0c;都急着去了解自己的大数据信用情况&#xff0c;常见的方式就是在百度搜索大数据信用&#xff0c;大数据报告查询&#xff0c;哪里能查大数据信用等关键词&#xff0c;随便找一个地方就去查…

好消息!终于解决了!Coze工作流错误中断问题终于得到解决!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 解决方案 📒📝 常见的工作流中断问题📝 好消息来了!⚓️ 相关链接 ⚓️📖 介绍 📖 大家是否曾经遇到过这样的问题:在Coze平台辛辛苦苦设计的一个工作流,尤其是流程非常复杂和长的情况下,只要中间一个环节出错,整…

ansible常用模块详解

一、Ansible 1.1 简介 Ansible是自动化运维工具&#xff0c;能实现跨主机对应用编排管理部署。 Ansible能批量配置、部署、管理上千台主机&#xff0c;是应用级别的跨主机编排工具。 比如以前需要切换到每个主机上执行的一或多个操作&#xff0c;使用Ansible只需在固定的一…

Mybatis-Plus的笔记

Mybatis-Plus其实是Mybatis的升级版&#xff0c;他简化了原先mybatis需要手动写CURD语句转而继承BaseMapper来实现。具体变化如下&#xff1a; 1&#xff0c;MyBatis-Plus简介&#xff1a;MP&#xff0c;是mybatis的增强工具&#xff0c;是基于mybatis上开发的。 特点&#xf…

智驾未来,一触即达——探索全新加油App的无限可能

一、引言 随着科技的飞速发展&#xff0c;智能出行已成为现代生活的重要组成部分。为了满足广大驾驶者的需求&#xff0c;我们倾力打造了一款全新的加油App&#xff0c;旨在为您的驾驶旅程提供前所未有的便捷与智能体验。 二、产品概述 我们的加油App不仅是一款导航工具&…