算法训练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).


相关文章
|
6天前
|
机器学习/深度学习 数据采集 算法
Python用逻辑回归、决策树、SVM、XGBoost 算法机器学习预测用户信贷行为数据分析报告
Python用逻辑回归、决策树、SVM、XGBoost 算法机器学习预测用户信贷行为数据分析报告
|
3天前
|
机器学习/深度学习 算法 数据处理
探索机器学习中的决策树算法
【5月更文挑战第18天】探索机器学习中的决策树算法,一种基于树形结构的监督学习,常用于分类和回归。算法通过递归划分数据,选择最优特征以提高子集纯净度。优点包括直观、高效、健壮和可解释,但易过拟合、对连续数据处理不佳且不稳定。广泛应用于信贷风险评估、医疗诊断和商品推荐等领域。优化方法包括集成学习、特征工程、剪枝策略和参数调优。
|
6天前
|
机器学习/深度学习 算法
理解并应用机器学习算法:决策树
【5月更文挑战第12天】决策树是直观的分类与回归机器学习算法,通过树状结构模拟决策过程。每个内部节点代表特征属性,分支代表属性取值,叶子节点代表类别。构建过程包括特征选择(如信息增益、基尼指数等)、决策树生成和剪枝(预剪枝和后剪枝)以防止过拟合。广泛应用在信贷风险评估、医疗诊断等领域。理解并掌握决策树有助于解决实际问题。
|
6天前
|
存储 缓存 算法
数据结构与算法 树(B树,B+树,红黑树待完善)
数据结构与算法 树(B树,B+树,红黑树待完善)
20 0
|
6天前
|
机器学习/深度学习 算法 数据可视化
Matlab决策树、模糊C-均值聚类算法分析高校教师职称学历评分可视化
Matlab决策树、模糊C-均值聚类算法分析高校教师职称学历评分可视化
|
6天前
|
机器学习/深度学习 算法 数据可视化
【Python机器学习专栏】决策树算法的实现与解释
【4月更文挑战第30天】本文探讨了决策树算法,一种流行的监督学习方法,用于分类和回归。文章阐述了决策树的基本原理,其中内部节点代表特征判断,分支表示判断结果,叶节点代表类别。信息增益等标准用于衡量特征重要性。通过Python的scikit-learn库展示了构建鸢尾花数据集分类器的示例,包括训练、预测、评估和可视化决策树。最后,讨论了模型解释和特征重要性评估在优化中的作用。
|
6天前
|
机器学习/深度学习 算法 搜索推荐
R语言LASSO特征选择、决策树CART算法和CHAID算法电商网站购物行为预测分析
R语言LASSO特征选择、决策树CART算法和CHAID算法电商网站购物行为预测分析
|
6天前
|
机器学习/深度学习 数据采集 算法
共享单车需求量数据用CART决策树、随机森林以及XGBOOST算法登记分类及影响因素分析
共享单车需求量数据用CART决策树、随机森林以及XGBOOST算法登记分类及影响因素分析
|
6天前
|
机器学习/深度学习 算法 数据挖掘
数据分享|R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病
数据分享|R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病
|
6天前
|
机器学习/深度学习 算法 数据挖掘
R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病
R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病