669. 修剪二叉搜索树 ,108.将有序数组转换为二叉搜索树 , 538.把二叉搜索树转换为累加树

简介: 1. **修剪二叉搜索树(669号题)**:通过递归方法,移除值不在指定范围 `[low, high]` 内的节点,同时保持树中剩余节点的相对结构不变。核心思想是根据当前节点值与边界的关系决定保留左子树还是右子树。2. **将有序数组转换为二叉搜索树(108号题)**:将一个升序排列的数组转化为一棵高度平衡的二叉搜索树。采用分治法,选取数组中间元素作为根节点,递归构建左右子树。即使数组长度为偶数,选择任一中间值均可满足条件。3. **把二叉搜索树转换为累加树(538号题)**:通过修改二叉搜索树中每个节点的值,使其等于原树中所有大于或等于该节点值的和。

题目:

  1. 修剪二叉搜索树
    给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。

所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。

示例 1:

输入:root = [1,0,2], low = 1, high = 2
输出:[1,null,2]
示例 2:

输入:root = [3,0,4,null,2,null,null,1], low = 1, high = 3
输出:[3,2,null,1]
提示:

树中节点数在范围 [1, 104] 内
0 <= Node.val <= 104
树中每个节点的值都是 唯一 的
题目数据保证输入是一棵有效的二叉搜索树
0 <= low <= high <= 104
题解:
class Solution {
public:
TreeNode trimBST(TreeNode root, int low, int high) {
if (root == nullptr ) return nullptr;
if (root->val < low) {
TreeNode right = trimBST(root->right, low, high); // 寻找符合区间[low, high]的节点
return right;
}
if (root->val > high) {
TreeNode
left = trimBST(root->left, low, high); // 寻找符合区间[low, high]的节点
return left;
}
root->left = trimBST(root->left, low, high); // root->left接入符合条件的左孩子
root->right = trimBST(root->right, low, high); // root->right接入符合条件的右孩子
return root;
}
};

题目:

  1. 将有序数组转换为二叉搜索树
    给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

示例 1:

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

示例 2:

输入:nums = [1,3]
输出:[3,1]
解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。
提示:

1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 按 严格递增 顺序排列
思考历程与知识点:
本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间。

分割点就是数组中间位置的节点。

那么为问题来了,如果数组长度为偶数,中间节点有两个,取哪一个?

取哪一个都可以,只不过构成了不同的平衡二叉搜索树。

题解:
class Solution {
private:
TreeNode traversal(vector& nums, int left, int right) {
if (left > right) return nullptr;
int mid = left + ((right - left) / 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& nums) {
TreeNode
root = traversal(nums, 0, nums.size() - 1);
return root;
}
};

题目:

  1. 把二叉搜索树转换为累加树
    给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

提醒一下,二叉搜索树满足下列约束条件:

节点的左子树仅包含键 小于 节点键的节点。
节点的右子树仅包含键 大于 节点键的节点。
左右子树也必须是二叉搜索树。
注意:本题和 1038: 力扣 相同

示例 1:

输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]
示例 2:

输入:root = [0,null,1]
输出:[1,null,1]
示例 3:

输入:root = [1,0,2]
输出:[3,3,2]
示例 4:

输入:root = [3,2,4,1]
输出:[7,9,4,10]
提示:

树中的节点数介于 0 和 104 之间。
每个节点的值介于 -104 和 104 之间。
树中的所有值 互不相同 。
给定的树为二叉搜索树。
题解:
class Solution {
private:
int pre = 0; // 记录前一个节点的数值
void traversal(TreeNode cur) { // 右中左遍历
if (cur == NULL) return;
traversal(cur->right);
cur->val += pre;
pre = cur->val;
traversal(cur->left);
}
public:
TreeNode
convertBST(TreeNode* root) {
pre = 0;
traversal(root);
return root;
}
};

————————————————

相关文章
|
6月前
|
存储 机器学习/深度学习 缓存
软考软件评测师——计算机组成与体系结构(分级存储架构)
本内容全面解析了计算机存储系统的四大核心领域:虚拟存储技术、局部性原理、分级存储体系架构及存储器类型。虚拟存储通过软硬件协同扩展内存,支持动态加载与地址转换;局部性原理揭示程序运行特性,指导缓存设计优化;分级存储架构从寄存器到外存逐级扩展,平衡速度、容量与成本;存储器类型按寻址和访问方式分类,并介绍新型存储技术。最后探讨了存储系统未来优化趋势,如异构集成、智能预取和近存储计算等,为突破性能瓶颈提供了新方向。
|
6月前
|
算法
104.二叉树的最大深度 , 111.二叉树的最小深度,222.完全二叉树的节点个数
本内容主要讲解了三道与二叉树相关的算法题及其解法,包括“二叉树的最大深度”、“二叉树的最小深度”和“完全二叉树的节点个数”。通过递归方法(前序或后序遍历)实现求解。 - **最大深度**:利用后序遍历计算根节点到最远叶子节点的路径长度。 - **最小深度**:同样采用后序遍历,但需特别处理单子树为空的情况,确保找到从根到最近叶子节点的路径。 - **完全二叉树节点数**:基于递归后序遍历统计左右子树节点数量并累加。 代码示例清晰展示了递归逻辑,帮助理解二叉树深度与高度的概念及其实现方式。
|
8月前
|
前端开发 JavaScript 开发者
这个被忽略的CSS:hover隐藏用法,让交互设计师都跪了
本文详细介绍了CSS中的伪类选择器`:hover`及其应用。`:hover`用于定义鼠标悬停在元素上时的样式,常见于超链接、按钮等交互场景。文章通过多个实例演示了`:hover`不仅可控制当前元素,还能影响其子元素或后代元素,但通常不适用于兄弟元素。此外,还分享了如何避免`:hover`导致的布局抖动问题,如提前设置透明边框。最后,结合实际案例展示了如何利用`:hover`实现复杂的交互效果,例如三级菜单,帮助开发者更好地掌握这一实用技巧。
457 1
这个被忽略的CSS:hover隐藏用法,让交互设计师都跪了
|
6月前
|
算法 定位技术 C++
455.分发饼干 ,376. 摆动序列 , 53. 最大子序和
**简介:** 本文介绍了三道经典的算法题及其解法,涵盖贪心算法、动态规划等重要思想。第一题“分发饼干”通过贪心策略,将大尺寸饼干优先分配给胃口大的孩子,实现满足最多孩子的目标。第二题“摆动序列”利用差值变化判断峰值,统计最长摆动子序列长度,需处理平坡与边界情况。第三题“最大子数组和”采用动态规划思想,在局部最优中寻找全局最大连续子数组和。三道题目均附有详细解析与C++代码实现,帮助理解算法核心逻辑与实现细节。
|
6月前
|
算法 测试技术 索引
122.买卖股票的最佳时机II ,55. 跳跃游戏 ,45.跳跃游戏II
**简介:** 本文介绍了三道经典算法题的解法,涵盖贪心算法的核心思想与应用。 1. **买卖股票的最佳时机 II**:通过收集每天的正利润实现最大收益,局部最优推导全局最优。 2. **跳跃游戏**:利用贪心算法扩展覆盖范围,判断是否能到达终点。 3. **跳跃游戏 II**:基于最大覆盖范围计算最小跳跃次数,平衡当前步与下一步的覆盖距离。 三道题目均采用贪心策略,通过优化局部选择实现整体最优解,代码简洁高效,时间复杂度低,适合解决类似问题。
|
6月前
|
算法
513.找树左下角的值,112. 路径总和 113.路径总和ii, 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构
本内容涵盖了三道与二叉树相关的算法题及其解决方案。第一题“找树左下角的值”通过深度优先搜索(DFS)找到二叉树最底层最左边的节点值。第二题“路径总和”判断是否存在从根到叶子节点的路径,其节点值之和等于目标值。第三题“从中序与后序遍历序列构造二叉树”利用中序和后序遍历结果还原二叉树结构。每个题解均采用递归方法实现,逻辑清晰且高效,适用于处理大规模数据的二叉树问题。
|
6月前
|
算法
459.重复的子字符串,28. 实现 strStr(),剑指Offer 05.替换空格
本内容涵盖三个字符串处理问题的解决方案,包括算法思路与代码实现。 **一、重复的子字符串(459题)**:通过构造新字符串并查找原字符串是否存在其中,巧妙判断是否由重复子串组成,时间复杂度低。 **二、找出字符串中第一个匹配项的下标(28题)**:运用KMP算法构建前缀表优化匹配过程,减少不必要的回溯操作,提高效率。 **三、替换空格(剑指Offer 05题)**:采用双指针法从后向前替换,避免频繁移动元素,空间复杂度更优。以上方法均针对字符串操作的经典问题,展示了高效算法设计的精髓。
|
6月前
|
安全 测试技术 持续交付
软考软件评测师——基于风险的测试技术
本文详细阐述了测试计划的核心要素与制定流程,涵盖测试范围界定、实施策略规划、资源配置及风险管理机制。通过风险识别方法论和评估模型,构建了完整的质量保障体系。同时,针对不同测试级别与类型提供具体配置建议,并提出技术选型原则与实施规范,确保测试活动高效有序开展,为项目成功奠定基础。内容结合实际经验,具有较强指导意义。
|
6月前
|
测试技术
软考软件评测师——可靠性测试测试方法
软件可靠性是指软件在规定条件和时间内完成规定功能的能力,受运行环境、软件规模、内部结构、开发方法及可靠性投入等因素影响。失效概率指软件运行中出现失效的可能性,可靠度为不发生失效的概率(R(t)=1-F(t)),平均无失效时间(MTTF)反映软件失效的平均间隔。案例中,嵌入式软件实测可靠度99.88%低于设计要求的99.99%,故不符合标准。
|
弹性计算
阿里云10M带宽收费价格表
阿里云10M带宽收费价格表,阿里云服务器上海地域10M带宽一年优惠价格5355元,10M带宽一个月525元,地域不同带宽价格不同,阿里云服务器网以华东1(上海)地域为例,5M及5M以下带宽按照23元一个月的价格收取,6M及6M以上公网带宽按照80元一个月的价格收取。阿里云百科使用阿里云价格计算器,计算一下阿里云10M公网带宽一个月价格和一年价格
383 0