当前位置: 首页 > news >正文

代码随想录day21二叉树8

文章目录

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

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

题目链接
文章讲解

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:// solve 函数递归地将部分数组转换为二叉搜索树TreeNode* solve(vector<int>& nums, int left, int right){// 递归结束条件:当左指针超过右指针时,表示当前区间无有效元素,返回 NULLif(left > right) return NULL;// 计算中间位置的索引,选择数组的中间元素作为当前子树的根节点int mid = left + ((right - left) / 2);  // 防止溢出,采用这种写法计算中点// 创建当前节点的树节点,值为数组中的中间值TreeNode* node = new TreeNode(nums[mid]);// 递归构建左子树:左区间是从 left 到 mid-1node->left = solve(nums, left, mid - 1);// 递归构建右子树:右区间是从 mid+1 到 rightnode->right = solve(nums, mid + 1, right);// 返回当前创建的树节点return node;}// 主函数:将整个排序数组转换为高度平衡的二叉搜索树TreeNode* sortedArrayToBST(vector<int>& nums) {// 调用递归函数,初始时整个数组的区间是从 0 到 nums.size()-1TreeNode* res = solve(nums, 0, nums.size() - 1);// 返回生成的平衡二叉搜索树的根节点return res;}
};

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

题目链接
文章讲解

class Solution {
public:// solve 函数执行逆中序遍历并更新节点值void solve(TreeNode* root, int& k) {if (root == NULL) return;  // 如果节点为空,直接返回// 逆中序遍历:首先遍历右子树solve(root->right, k);// 更新当前节点值:将当前节点的值加上之前访问过的节点的值(k)root->val += k;// 更新 k 为当前节点的值k = root->val;// 最后遍历左子树solve(root->left, k);}// 主函数:将二叉搜索树转换为累加树TreeNode* convertBST(TreeNode* root) {int k = 0;  // 初始化 k 为 0,用于累加solve(root, k);  // 执行逆中序遍历并更新树的节点值return root;  // 返回转换后的树的根节点}
};

669. 修剪二叉搜索树

题目链接
文章讲解

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:// 修剪二叉搜索树,返回符合区间 [low, high] 的树TreeNode* trimBST(TreeNode* root, int low, int high) {// 递归的基准条件:如果当前节点为空,则返回 nullptrif (root == nullptr) return nullptr;// 如果当前节点值小于 low,则不需要这个节点和它的左子树,递归修剪右子树if (root->val < low) {TreeNode* right = trimBST(root->right, low, high); // 寻找符合区间 [low, high] 的节点return right; // 返回修剪后的右子树}// 如果当前节点值大于 high,则不需要这个节点和它的右子树,递归修剪左子树if (root->val > high) {TreeNode* left = trimBST(root->left, low, high); // 寻找符合区间 [low, high] 的节点return left; // 返回修剪后的左子树}// 如果当前节点的值在 [low, high] 之间,递归修剪左右子树root->left = trimBST(root->left, low, high); // 修剪左子树root->right = trimBST(root->right, low, high); // 修剪右子树// 返回当前节点(它的左右子树已经被修剪)return root;}
};
http://www.dtcms.com/a/264159.html

相关文章:

  • 可信数据空间:概念、架构与应用实践
  • kafka自定义分区器
  • Webpack的插件机制Tapable
  • 华为认证二选一:物联网 VS 人工智能,你的赛道在哪里?
  • 打造 AI 产品的前端架构:响应式、流式、智能交互三合一
  • uv介绍以及与anaconda/venv的区别
  • C#系统学习第七章——数组
  • python 继承
  • 《UE5_C++多人TPS完整教程》学习笔记39 ——《P40 远程过程调用(Remote Procedure Calls)》
  • 增材制造研究领域:3D 打印设计国际会议
  • 责任链模式 Go 语言实战
  • 电脑系统重装有什么用?
  • 动手实践:如何提取Python代码中的字符串变量的值
  • AI问答-vue3:如何选择使用reactive或ref
  • 【HarmonyOS】鸿蒙使用仓颉编程入门
  • 基于Halcon平台的常规OCR与深度OCR性能对比分析
  • 设计模式(行为型)-访问者模式
  • python训练day46 通道注意力
  • 【kernel8】spi协议,验证,模型,设备树处理,spidev,衍生协议
  • AI人工客服实战指南:基于大模型构建生产级智能对话系统
  • Hadoop、Spark、Flink 三大大数据处理框架的能力与应用场景
  • ESP32-S3开发板深度评测:AI语音识别与图像处理全面解析
  • C++ 第四阶段 STL 容器 - 第九讲:详解 std::map 与 std::unordered_map —— 关联容器的深度解析
  • Springboot整合高德地图
  • NeurIPS-2023《A Definition of Continual Reinforcement Learning》
  • 基于GD32 MCU的IAP差分升级方案
  • 迎战 AI Overviews:SEO 不被淘汰的实战策略
  • SpringBoot全局异常详解
  • Electron 应用打包与分发:从开发到交付的完整指南
  • 多容器应用与编排——AI教你学Docker