代码随想录算法训练营第23天|669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树、总结篇

本文主要是介绍代码随想录算法训练营第23天|669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树、总结篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 一、力扣669.修剪二叉搜索树
    • 1.1 题目
    • 1.2 思路
    • 1.3 代码
  • 二、力扣108.将有序数组转换为二叉搜索树
    • 2.1 题目
    • 2.2 思路
    • 2.3 代码
    • 2.4 总结
  • 三、力扣538.把二叉搜索树转换为累加树
    • 3.1 题目
    • 3.2 思路
    • 3.3 代码
    • 3.4 总结

一、力扣669.修剪二叉搜索树

1.1 题目

在这里插入图片描述

1.2 思路

本题递归代码分三个模块来写:
(1)递归终止条件:null节点
(2)该节点为要删除节点的处理逻辑:继续向左或者向右递归,将有效的节点返回给上层节点
(3)该节点为不需要删除节点的处理逻辑:继续向左和又递归,将有效的节点返回给本节点作为左右孩子

1.3 代码

class Solution {public TreeNode trimBST(TreeNode root, int low, int high) {//判断特殊情况if(root == null){return null;}return traversal(root,low,high);}//递归public TreeNode traversal(TreeNode root,int low,int high){//递归终止条件if(root == null){return null;}//如果当前节点是需要被删除的节点if(root.val < low){return traversal(root.right,low,high);}if(root.val > high){return traversal(root.left,low,high);}//如果该节点符合条件,不需要被删除root.left = traversal(root.left,low,high);root.right = traversal(root.right,low,high);return root;}
}

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

2.1 题目

在这里插入图片描述

2.2 思路

注意是平衡二叉搜索树;
选取二叉树的中间节点(数组的中间数),根据数组的左右区间来构造二叉树的左右子树。

2.3 代码

lass Solution {public TreeNode sortedArrayToBST(int[] nums) {if(nums.length == 0){return null;}return traversal(nums,0,nums.length-1);}//递归,划分区间构造左右子树(坚持区间左闭右闭原则)public TreeNode traversal(int[] nums,int left,int right){//递归终止条件if(left > right){return null;}int mid = left +((right-left)>>1);//注意使用移位运算符要加括号TreeNode root = new TreeNode(nums[mid]);root.left = traversal(nums,left,mid-1);root.right = traversal(nums,mid+1,right);return root;}
}

2.4 总结

构造二叉树:有序数组选取中间节点,然后递归划分左右区间构造左右子树。
注意使用移位运算符要加括号。

三、力扣538.把二叉搜索树转换为累加树

3.1 题目

在这里插入图片描述

3.2 思路

我的思路:先将二叉树中序遍历一遍,将值记录再数组中;
第二次中序遍历时直接累加赋值(设置一个起始索引,置为0,每遍历一个节点就起始索引加一,直到遍历结束)
代码随想录:右中左

3.3 代码

我的思路:(跑出来是错的)

class Solution {public List<Integer> res = new ArrayList<>();public int quitIndex = -1; public TreeNode convertBST(TreeNode root) {if(root == null){return null;}//第一次中序遍历,从小到大拿到所有节点的值traversal(root);//第二次遍历,为节点重新赋值int sum = 0;for(int i =0;i<res.size();i++){sum += res.get(i);}traversal2(root,sum);return root;}public void traversal(TreeNode root){if(root == null){return;}//左中右traversal(root.left);res.add(root.val);traversal(root.right);}public void traversal2(TreeNode root,int sum){if(root == null){return;}//左中右traversal2(root.left,sum);if(quitIndex != -1){sum -= res.get(quitIndex);root.val = sum;quitIndex++;}else{root.val = sum;quitIndex++;}traversal2(root.right,sum);}
}

右中左(相当于从大到小遍历):

class Solution {public int beforeSum = 0;public TreeNode convertBST(TreeNode root) {//右中左递归遍历(按值从大到小)if(root == null){return null;}traversal(root);return root;}public void traversal(TreeNode root){if(root == null){return;}traversal(root.right);//中:更新本节点的值beforeSum += root.val;root.val = beforeSum;traversal(root.left);}
}

3.4 总结

还是要利用好二叉搜索树的有序特性!

二叉树总结参考代码随想录:https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E6%80%BB%E7%BB%93%E7%AF%87.html#%E6%9C%80%E5%90%8E%E6%80%BB%E7%BB%93
在这里插入图片描述

这篇关于代码随想录算法训练营第23天|669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树、总结篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/796153

相关文章

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python