[代码随想录Day21打卡] 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 总结篇

669. 修剪二叉搜索树

给定一个二叉搜索树root,给定一个范围[low, high],修剪二叉搜索树,使修建后的二叉搜索树的值的范围在[low, high]内。
思想:当前节点的值和给定的范围之间的关系,如果当前节点的值大于high那么就是递归遍历它的左子树(因为它的左子树中的值小于该节点的值,可能存在符合范围的节点),如果当前节点的值小于low,那么递归遍历它的右子树(因为他的右子树中的值大于该节点的值,可能存在符合范围的节点)。

递归三部曲
确定递归函数的参数和返回值:参数就是root, low, high,返回值类型是TreeNode*,返回的给定范围的修建后的二叉树的根节点。
确定终止条件:
如果root==NULL return NULL;
确定单层递归的逻辑:
中: 如果当前节点的值小于low,返回traversal(root->right, low, right),如果当前节点的值大于high,返回traversal(root->left,low, high);
左:root-> left = traversal(root->left, low, high)
右:root->right = traversal(root->right, low, high)
return root;

在这里插入图片描述
下面是C++, JAVA, Python代码。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
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;}
};
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
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;}
}
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):def trimBST(self, root, low, high):""":type root: Optional[TreeNode]:type low: int:type high: int:rtype: Optional[TreeNode]"""if root==None:return Noneif root.val < low:return self.trimBST(root.right, low, high)if root.val > high:return self.trimBST(root.left, low, high)root.left = self.trimBST(root.left, low, high)root.right = self.trimBST(root.right, low, high)return root

参考文章

  1. https://programmercarl.com/0669.%E4%BF%AE%E5%89%AA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE

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

有点类似于前面的构造最大二叉树。
构造二叉树的遍历方式一般选择前序遍历。
思想: 选取中间值构造根节点,选取左区间构造左子树,选取右区间构造右子树。
注意:区间定义要统一。这里使用左闭右闭。(也可以左闭右开)
递归三部曲
确定递归函数的参数和返回值:参数就是nums,left,right,返回值类型是TreeNode*,返回的数组nums的[left, right]区间内构造的二叉树的根节点。
确定终止条件:
如果left>right(与区间定义有关),return NULL; 如果left>right没有值无法构造节点就返回空。
确定单层递归的逻辑:
中: 确定区间的中间位置mid = (left+right)/2,构造新的根节点root = new TreeNode(nums[mid])
左:root->left = traversal(nums, left, mid-1)//这个还是和区间定义有关我们是左闭右闭所以左区间就是left,mid-1不包括mid
右:root->right = traversal(nums, mid+1, right) //右区间不包括mid所以从mid+1开始
return root;
下面是C++, JAVA, Python代码。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
private: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;}
public:TreeNode* sortedArrayToBST(vector<int>& nums) {return traversal(nums, 0, nums.size()-1);}
};
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public TreeNode traversal(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;}public TreeNode sortedArrayToBST(int[] nums) {return traversal(nums, 0, nums.length-1);}
}
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):def sortedArrayToBST(self, nums):""":type nums: List[int]:rtype: Optional[TreeNode]"""# if len(nums) <=0:#     return None# mid = len(nums)/2# root = TreeNode(nums[mid])# root.left = self.sortedArrayToBST(nums[:mid])# root.right = self.sortedArrayToBST(nums[mid+1:])# return rootreturn self.traversal(nums, 0, len(nums)-1)def traversal(self, nums, left, right):if left > right:return Nonemid = (left+right)/2root = TreeNode(nums[mid])root.left = self.traversal(nums, left, mid-1)root.right = self.traversal(nums, mid+1, right)return root

参考文章

  1. https://programmercarl.com/0108.%E5%B0%86%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E8%BD%AC%E6%8D%A2%E4%B8%BA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html

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

秒了。
这个是中序倒过来,遍历顺序就是右中左。
设定一个全局变量保存前一个节点的值就可以了。
递归三部曲
确定递归函数的参数和返回值:参数是root,返回值是变成累加树的二叉树的根节点。
确定终止条件:
如果root==NULL return;
确定单层递归的逻辑:
右:root->right = traversal(root->right)
中: root->val += pre; pre = root->val;//更新pre使他一直保存着前一个节点的值
左:root->left= traversal(root->left)
return root;

下面是C++, JAVA, Python代码。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {int count = 0;
public:TreeNode* convertBST(TreeNode* root) {if(root==NULL) return NULL;root->right = convertBST(root->right);root->val = root->val+count;count = root->val;root->left = convertBST(root->left);return root;}
};// class Solution {
//     // int count = 0;
//     TreeNode* pre;
// public:
//     TreeNode* convertBST(TreeNode* root) {
//         if(root==NULL) return NULL;
//         root->right = convertBST(root->right);
//         if(pre==NULL){
//             pre = root;
//         }else{
//             root->val += pre->val;
//             pre = root;
//         }
//         root->left = convertBST(root->left);
//         return root;
//     }
// };
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {int pre = 0;public TreeNode convertBST(TreeNode root) {if(root==null) return null;root.right = convertBST(root.right);        root.val += pre;pre = root.val;root.left = convertBST(root.left);return root;}
}
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):def __init__(self):self.pre = 0def convertBST(self, root):""":type root: Optional[TreeNode]:rtype: Optional[TreeNode]"""if root == None:return Noneroot.right = self.convertBST(root.right)root.val = root.val + self.preself.pre = root.valroot.left = self.convertBST(root.left)return root

参考文章

  1. https://programmercarl.com/0538.%E6%8A%8A%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E8%BD%AC%E6%8D%A2%E4%B8%BA%E7%B4%AF%E5%8A%A0%E6%A0%91.html

终于刷完二叉树了,关键一定要思考遍历的顺序。

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

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

相关文章

apr共享内存

下载&#xff1a; Download - The Apache Portable Runtime Project 编译&#xff1a; 使用cmake-gui生成库&#xff1a; apr-1.lib aprapp-1.lib libapr-1.lib libaprapp-1.lib libapr-1.dll 在Developer PowerShell for VS 2019中&#xff1a; 执行nmake -f Makefile.win来…

借助算力云跑模型

算力平台&#xff1a;FunHPC | 算力简单易用 AI乐趣丛生 该文章只讲述了最基本的使用步骤&#xff08;因为我也不熟练&#xff09;。 【注】&#xff1a;进入平台&#xff0c;注册登录账号后&#xff0c;才能租用。学生认证&#xff0b;实名认证会有免费的算力资源&#xff0…

聚水潭与MySQL数据集成案例分享

聚水潭数据集成到MySQL的技术案例分享 在现代数据驱动的业务环境中&#xff0c;如何高效、可靠地实现不同系统之间的数据对接成为企业关注的焦点。本次案例将详细介绍如何通过轻易云数据集成平台&#xff0c;将聚水潭的数据无缝集成到MySQL数据库中&#xff0c;实现从“聚水谭…

C语言中const char *字符进行切割实现

将127.0.0.1以“”“.”来进行切割&#xff0c;实现如下&#xff1a; const char * ip "127.0.0.1";char *test new char[100];strcpy(test, ip);const char *split ".";char *final;final strtok(test, split);while (final){printf("%s\n"…

java基础知识(常用类)

一、包装类&#xff08;Wrapper) &#xff08;1&#xff09;包装类与基本数据的转换 装箱&#xff1a;基本类型->包装类型 拆箱&#xff1a;包装类型->基本类型 java5以后是自动装箱和拆箱的方式&#xff0c;自动装箱底层调用的是valueOf方法&#xff0c;比如Integer.…

【Python系列】字典灵活的数据存储与操作

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

neo4j图数据库community-5.50创建多个数据库————————————————

1.找到neo4J中的conf文件&#xff0c;我的路径是&#xff1a;D:\Program Files\neo4j-community-5.5.0-windows\neo4j-community-5.5.0\conf 这里找自己的安装路径&#xff0c; 2.用管理员模式打开conf文件&#xff0c;右键管理员&#xff0c;记事本或者not 3.选中的一行新建一…

AVL树实现

1. AVL的概念 AVL树是最先发明的⾃平衡⼆叉查找树&#xff0c;AVL是⼀颗空树&#xff0c;或者具备下列性质的⼆叉搜索树&#xff1a;它的 左右⼦树都是AV树&#xff0c;且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树&#xff0c; 通过控制⾼度差去控制平…

jvm发展历程介绍

初始阶段&#xff1a;JDK 1.0 - JDK 1.1 • 经典JVM&#xff1a;这是JVM的早期实现&#xff0c;主要特点是使用解释器&#xff08;Interpreter&#xff09;来逐行解释执行Java字节码。这种方式虽然简单直接&#xff0c;但执行效率相对较低。 • JIT编译器&#xff08;Just-In-T…

准备阶段 Profiler性能分析工具的使用(一)

Unity 性能分析器 (Unity Profiler) 性能分析器记录应用程序性能的多个方面并显示相关信息。使用此信息可以做出有关应用程序中可能需要优化的事项的明智决策&#xff0c;并确认所做的优化是否产生预期结果。 默认情况下&#xff0c;性能分析器记录并保留游戏的最后 300 帧&a…

初学 flutter 环境变量配置

一、jdk&#xff08;jdk11&#xff09; 1&#xff09;配置环境变量 新增&#xff1a;JAVA_HOMEC:\Program Files\Java\jdk-11 //你的jdk目录 在path新增&#xff1a;%JAVA_HOME%\bin2&#xff09;验证是否配置成功&#xff08;cmd运行命令&#xff09; java java -version …

HTML 元素类型介绍

目录 1. 块级元素&#xff08;Block-level Elements&#xff09; 2. 行级元素&#xff08;Inline Elements&#xff09; 3. 行内块级元素&#xff08;Inline-block Elements&#xff09; 4. 表格相关元素 5. 列表相关元素 6. 表单相关元素 示例代码 示例效果 ​编辑 …

高危,Laravel参数注入漏洞安全风险通告

今日&#xff0c;亚信安全CERT监控到安全社区研究人员发布安全通告&#xff0c;披露了Laravel 参数注入漏洞(CVE-2024-52301)。在受影响的版本中&#xff0c;Application.php 文件的 detectEnvironment 函数直接使用了 $_SERVER[argv]&#xff0c;但没有检查运行环境是否为 CLI…

表格数据处理中大语言模型的微调优化策略研究

论文地址 Research on Fine-Tuning Optimization Strategies for Large Language Models in Tabular Data Processing 论文主要内容 这篇论文的主要内容是研究大型语言模型&#xff08;LLMs&#xff09;在处理表格数据时的微调优化策略。具体来说&#xff0c;论文探讨了以下…

如何搭建C++环境--1.下载安装并调试Microsoft Visual Studio Previerw(Windows)

1.首先&#xff0c;打开浏览器 首先&#xff0c;搜索“Microsoft Visual Studio Previerw” 安装 1.运行VisualStudioSetup (1).exe 无脑一直点继续 然后就到 选择需要的语言 我一般python用pycharm Java&#xff0c;HTML用vscode&#xff08;Microsoft Visual Studio cod…

数字化工厂 MES试点方案全解析(二)

生产过程监控与数据采集 在生产线上部署各类传感器、数据采集终端等设备&#xff0c;与 MES 系统相连&#xff0c;实时采集生产数据&#xff0c;如设备运行参数&#xff08;温度、压力、转速等&#xff09;、产品加工数据&#xff08;尺寸、重量、加工时间等&#xff09;、物料…

TCP vs UDP:如何选择适合的网络传输协议?

在网络通信中&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff09;和UDP&#xff08;User Datagram Protocol&#xff09;是两种非常重要的传输层协议。它们各有特点&#xff0c;适用于不同类型的应用场景。本文将详细探讨TCP和UDP协议的结构、优缺点及应用&…

Redis最终篇分布式锁以及数据一致性

在前三篇我们几乎说完了Redis的所有的基础知识以及Redis怎么实现高可用性,那么在这一篇文章中的话我们主要就是说明如果我们使用Redis出现什么问题以及解决方案是什么,这个如果在未来的工作中也有可能会遇到,希望对看这篇博客的人有帮助,话不多说直接开干 一.Hotkey以及BigKey…

docker搭建私有的仓库

docker搭建私有仓库 一、为什么要搭建私有的仓库&#xff1f; 因为在国内&#xff0c;访问&#xff1a;https://hub.docker.com/ 会出现无法访问页面。。。。&#xff08;已经使用了魔法&#xff09; 当然现在也有一些国内的镜像管理网站&#xff0c;比如网易云镜像服务、Dao…

1123--日期类

目录 一 java 1. Date类 2. calendar类 3. 第三代日期类‘ 3.1 常用方法 3.2 格式化操作 一 java 1. Date类 2. calendar类 3. 第三代日期类‘ 3.1 常用方法 3.2 格式化操作