算法训练Day23|669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树

简介: 算法训练Day23|669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树

LeetCode:669. 修剪二叉搜索树

669. 修剪二叉搜索树 - 力扣(LeetCode)


1.思路

修剪就是根据指定区间进行符合条件的递归。位于区间两侧的往区间内靠拢,也即小于low时,向右遍历并返回节点,大于high时,向左遍历并返回节点。位于区间内时,遍历该节点的左右子树。


2.代码实现

 1class Solution {
 2    public TreeNode trimBST(TreeNode root, int low, int high) {
 3        // 递归法遍历整棵树
 4        // 当节点值不介于low和high之间时,返回null
 5        if (root == null) return null;
 6        // 小于时向右遍历
 7        if (root.val < low) {
 8            return trimBST(root.right, low, high);
 9        } else if (root.val > high) { // 大于时,向左遍历
10            return trimBST(root.left, low, high);
11        } 
12        // 介于之间时,遍历该节点下的所有节点
13        root.left = trimBST(root.left, low, high);
14        root.right = trimBST(root.right, low, high);
15        return root;
16    }
17}

3.复杂度分析

时间复杂度:O(n).至多遍历整棵树,量级为O(n).

空间复杂度:O(n).调用递归函数的深度即为栈的开销,最坏的情况是当二叉搜索树为链表。


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

108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)


1.思路

选取数组中间节点元素作为根节点,分别对其进行左右遍历构建该节点的左右子树,返回即可。

存在问题:逻辑挺清晰的,实现有难度,下次硬干。。。


2.代码实现

 1class Solution {
 2    public TreeNode sortedArrayToBST(int[] nums) {
 3
 4        // 调用辅助函数,传入数组和数组的边界索引
 5        return sortedArrayToBST(nums, 0, nums.length);
 6    }
 7
 8    public TreeNode sortedArrayToBST(int[] nums, int left, int right) {
 9        // 如果左边界>=右边界,表示没有元素,返回null
10        if (left >= right) {
11            return null;
12        }
13        // 如果只有一个元素,创建节点,将元素加入节点中,并返回节点
14        if (right - left == 1) {
15            return new TreeNode(nums[left]);
16        }
17        // 如果有多个元素,中间向两侧遍历、创建节点、赋值
18        int mid = left + (right - left) / 2;
19        TreeNode root = new TreeNode(nums[mid]);
20        // 构建该节点的左子树
21        root.left = sortedArrayToBST(nums, left, mid);
22        // 构建该节点的右子树
23        root.right = sortedArrayToBST(nums, mid + 1, right);
24        return root;
25    }
26}

3.复杂度分析

时间复杂度:时间消耗取决于递归函数的调用次数,而调用递归函数的次数为O(n).

空间复杂度:取决于栈的开销,栈的开销取决于递归函数的调用深度,O(n/2).


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

538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)


1.思路

利用二叉搜索树的左中右升序的特性,该题是从右至左累加,所以遍历顺序采用右——中——左进行。定义全局变量sum,将该值赋给相应的节点即可。


2.代码实现

 1class Solution {
 2    int sum; // 声明全局变量
 3    public TreeNode convertBST(TreeNode root) {
 4        convertBST1(root);
 5        return root;
 6    }
 7    // 单层递归逻辑
 8    public void convertBST1(TreeNode root) {
 9        // 终止条件
10        if (root == null) {
11            return;
12        }
13        convertBST1(root.right);
14        sum += root.val;
15        root.val = sum;
16        convertBST1(root.left);
17    }
18}

3.复杂度分析

时间复杂度:O(n).

空间复杂度:调用函数消耗的空间为栈空间的消耗,因此空间消耗取决于递归函数的调用层数或者深度。最坏情况是链表,则空间复杂度为O(n).


相关文章
|
3月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
99 1
|
6天前
|
算法
树的遍历算法有哪些?
不同的遍历算法适用于不同的应用场景。深度优先搜索常用于搜索、路径查找等问题;广度优先搜索则在图的最短路径、层次相关的问题中较为常用;而二叉搜索树的遍历在数据排序、查找等方面有重要应用。
13 2
|
1月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
56 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
14天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
1月前
|
机器学习/深度学习 算法 决策智能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
|
1月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
18 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
1月前
|
算法 Java C++
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
|
2月前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
51 2
|
1月前
|
算法
❤️算法笔记❤️-(每日一刷-26、删除有序数组的重复项)
❤️算法笔记❤️-(每日一刷-26、删除有序数组的重复项)
23 0