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

第六章 二叉树part05

2026.03.13 02.13 第十七天

654 最大二叉树

本题难度不大,在前一天的基础上很快就能够写出来。

可以注意一下标准库提供的查找最大值的方法和区间范围控制

使用了中间节点,就要在传入右边区间的时候起始值多加一。

class Solution {
private:TreeNode* travelsal(vector<int>& nums, int begin, int end) {// 1. 基准情况:如果区间为空,返回空if (begin >= end) return nullptr;// 2. 找到当前区间的最大值及其下标auto it_begin = nums.begin() + begin;auto it_end = nums.begin() + end;auto maxIt = std::max_element(it_begin, it_end);int maxIndex = std::distance(nums.begin(), maxIt);// 3. 构建当前根节点TreeNode* root = new TreeNode(*maxIt);// 4. 递归构建左右子树// 左区间:[begin, maxIndex)root->left = travelsal(nums, begin, maxIndex);// 右区间:[maxIndex + 1, end)  <-- 注意这里必须 +1root->right = travelsal(nums, maxIndex + 1, end);return root;}public:TreeNode* constructMaximumBinaryTree(vector<int>& nums) {return travelsal(nums, 0, nums.size());}
};

617 合并二叉树

这题很简单,每次传入两个节点,遍历即可

新树能不能直接使用旧树的节点是个问题

递归法:

class Solution {
public:TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {if (t1 == NULL) return t2; // 如果t1为空,合并之后就应该是t2if (t2 == NULL) return t1; // 如果t2为空,合并之后就应该是t1// 修改了t1的数值和结构t1->val += t2->val;                             // 中t1->left = mergeTrees(t1->left, t2->left);      // 左t1->right = mergeTrees(t1->right, t2->right);   // 右return t1;}
};

迭代法使用队列模拟层序遍历即可。

700 二叉搜索树中的搜索

比较简单

迭代法非常符合直觉,实现也很简单,由于二叉搜索树本身的性质,不需要借助栈来实现。

迭代法:

class Solution {
public:TreeNode* searchBST(TreeNode* root, int val) {if(root == nullptr) return nullptr;while(root) {if(root->val == val) {return root;}else if(root->val < val) {root = root->right;}else {root = root->left;}}return nullptr;}
};

递归法:

也很简单~

class Solution {
public:TreeNode* searchBST(TreeNode* root, int val) {if(root == nullptr || root->val == val) return root;TreeNode* result = nullptr;if(root->val < val) result = searchBST(root->right, val);if(root->val > val) result = searchBST(root->left, val);return result;}
};

28 验证二叉搜索树

递归法先使用中序遍历,利用中序遍历结果是从小到大序列的性质,生成数组,验证数组是否是严格从小到大即可。

class Solution {
private:vector<int> vec;void travelsal(TreeNode* node) {if(node == nullptr) return;travelsal(node->left);vec.push_back(node->val);travelsal(node->right);}public:bool isValidBST(TreeNode* root) {travelsal(root);for(int i = 0; i < vec.size() - 1; i++) {if(vec[i] >= vec[i + 1]) return false;}return true;}
};

如果直接在递归过程中比较,会有几个大坑,需要注意!!!

另一种迭代法:

class Solution {
public:TreeNode* pre = NULL; // 用来记录前一个节点bool isValidBST(TreeNode* root) {if (root == NULL) return true;bool left = isValidBST(root->left);if (pre != NULL && pre->val >= root->val) return false;pre = root; // 记录前一个节点bool right = isValidBST(root->right);return left && right;}
};

有一点理解难度,利用了中序遍历,二叉搜索树前一个节点值始终小于后一个的特点。

迭代法思路相同。

http://www.jsqmd.com/news/473174/

相关文章:

  • 百度文库文档提取完全指南:突破内容获取限制的开源解决方案
  • 3步破解文档访问限制:让开源资源自由获取的极简方案
  • 企业级项目管理平台部署指南:从痛点解决到高级应用
  • STM32 USART高级功能实战:智能卡自适应、IrDA调优与DMA零拷贝
  • OCR文字识别实战:用CRNN镜像快速提取发票、文档文字
  • 人才盘点与人才梯队建设的关键思路与方法
  • EagleEye DAMO-YOLO TinyNAS在智慧零售中的人流分析应用
  • SOONet效果实测分享:在3670小时Ego4D数据上实现MAD榜单SOTA精度
  • 千问图像生成16Bit(Qwen-Turbo-BF16)开源镜像部署教程:BF16防黑图全解析
  • Cursor Pro功能突破技术解析:从限制解除到价值挖掘实战指南
  • RTDETR多模态融合实战:基于注意力机制的红外与可见光目标检测优化
  • GLM-4.6V-Flash-WEB新手入门:从镜像部署到智能识图,完整流程分享
  • 华为MateBook 14 2020锐龙版Ubuntu18.04系统下RTL8822CE网卡驱动安装全攻略
  • ML Visuals工具集:提升机器学习内容效率的可视化解决方案
  • Cursor Pro功能创新突破:从限制解除到高级应用实战指南
  • 破解试用限制难题:macOS系统Navicat试用期重置工具全攻略
  • EcomGPT-中英文-7B电商模型AI能力展示:多轮对话式商品推荐系统
  • RTX 4090+Qwen2.5-VL-7B-Instruct开源方案:低成本构建企业级视觉AI助手
  • Navicat实战指南:从零开始掌握MySQL数据库管理
  • M2LOrder多语言情感分析测试:中文与英文场景效果对比
  • Midscene.js智能测试框架实战指南:从痛点突破到效能倍增
  • VideoAgentTrek Screen Filter 快速体验:无需安装,在线Demo与API测试指南
  • 【20年PHP老兵压箱底笔记】:PHP 8.9中Deprecated Warning首次支持Error Handler拦截——3行代码接管弃用提示
  • 如何让GitHub公式显示不再抓狂?GitHub-MathJax插件的4大实用价值解析
  • “use function”终于能链式调用?PHP 8.9命名空间增强中的5个未公开API细节(仅限首批RC测试者知晓)
  • AIVideo实战教程:AI自动为长视频添加关键帧标记与章节导航菜单
  • Qwen3-0.6B问题解决:部署中常见错误排查与快速修复方法
  • CosyVoice语音生成大模型-300M-25Hz环境清理:C盘空间优化与依赖管理
  • BGE Reranker-v2-m3 Python调用指南:绕过UI直接API接入,适配自有检索Pipeline
  • L-BFGS算法在自动驾驶路径规划中的平滑优化实践