代码随想录算法训练营第二十三天 | 669.修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树
669.修剪二叉搜索树
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root == nullptr) return nullptr;
// 当前值小于左边界时,当前节点的左子树全部小于左边界,所以全部删除,直接处理右子树
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;
}
};
将有序数组转换为二叉搜索树
思路:二分法划分区间,将中间节点作为当前节点,左区间挂在左子树,右区间挂在右子树,保证二叉树有序平衡
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
TreeNode* root;
root = binaryFind(nums, 0, nums.size());
return root;
}
TreeNode* binaryFind(vector<int>& nums, int left, int right) {
if(left < right) {
int mid = ((right - left) >> 1) + left;
TreeNode* node = new TreeNode(nums[mid]);
node->left = binaryFind(nums, left, mid);
node->right = binaryFind(nums, mid + 1, right);
return node;
}
return nullptr;
}
};
538.把二叉搜索树转换为累加树
此题的关键在于遍历顺序,以右中左的顺序遍历并逐渐累加结果即可
class Solution {
public:
TreeNode* convertBST(TreeNode* root) {
int count = 0;
traversal(root, count);
return root;
}
void traversal(TreeNode* root, int& count) {
if(root == nullptr) return ;
traversal(root->right, count); // 中序遍历右子树
count += root->val; // 累加结果
root->val = count;
traversal(root->left, count); // 中序遍历左子树
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构