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

代码随想录算法训练营Day-17 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

654.最大二叉树

和中序后序数组构造二叉树的思路一致,要更简单一些。

思路:

1.如果数组为空,返回NULL

2.然后开始找数组最大值,根据这个最大值创建根节点

3.以最大值为中心,分割出左数组和右数组

4.根节点的左孩子为左数组构建出的子树

5.根节点的右孩子为右数组构建出的子树

优化:

省去在每个调用都创建新数组的过程,可以使用左右索引来替代,函数传入根节点和左右索引,左右索引可再原数组上进行切割,效果相同。

class Solution { public: TreeNode* traversal(vector<int>& nums, int left, int right){ if(right<=left) return NULL; int idx=left; for(int i=left+1; i<right; ++i){ if(nums[i]>nums[idx]) idx = i; } TreeNode* root = new TreeNode(nums[idx]); root->left = traversal(nums, left, idx); root->right = traversal(nums, idx+1, right); return root; } TreeNode* constructMaximumBinaryTree(vector<int>& nums) { return traversal(nums,0,nums.size()); } };

617.合并二叉树

思路:

终止条件是遇到1节点为空就返回2节点,遇到2节点为空就返回1节点,包含了所有三种情况;

进行前序遍历,先执行两节点值相加的操作,然后执行左右遍历的操作,并用t1节点的左右孩子节点接住,注意遍历时要同步遍历;

TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) { if(!t1) return t2; if(!t2) return t1; t1->val += t2->val; t1->left = mergeTrees(t1->left, t2->left); t1->right = mergeTrees(t1->right, t2->right); return t1; }

700.二叉搜索树中的搜索

递归法思路:遇到空节点返回空,遇到值节点,返回值节点;遇到的节点值大于值,返回调用左子树;到的节点值小于值,返回调用右子树(利用二叉搜索树的左小右大的特性)。

TreeNode* searchBST(TreeNode* root, int val) { if(root == NULL) return NULL; if(root->val == val) return root; if(root->val > val) return searchBST(root->left,val); if(root->val < val) return searchBST(root->right,val); return NULL; }

迭代法思路:搜索二叉树路径是固定的,迭代法很简单。如果节点不为空就一直遍历下去,遇到值节点,返回值节点;遇到的节点值大于值,就更新节点为它的左孩子继续搜索;遇到的节点值小于值,就更新节点为它的右孩子继续搜索。

TreeNode* searchBST(TreeNode* root, int val) { while(root!=NULL){ if(root->val == val) return root; else if(root->val > val) root = root->left; else root = root->right; } return NULL; }

98.验证二叉搜索树

本题有两个思路,一个是使用中序遍历得到数组,数组如果严格递增就说明是二叉搜索树;

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

另一个也是中序遍历,然后在遍历中判断当前节点是不是大于最大值(最大值一直在更新),如果不是大于,就返回false,最后返回左子树和右子树的调用结果的&&。

long long maxValue = LONG_MIN; bool isValidBST(TreeNode* root) { if(root==NULL) return true; bool left = isValidBST(root->left); if(maxValue<root->val) maxValue = root->val; else return false; bool right = isValidBST(root->right); return left && right; }
http://www.jsqmd.com/news/587232/

相关文章:

  • 告别重复造轮子:用快马生成openclaw启动高效开发工具链
  • 江诗丹顿官方售后服务中心新址实地考察报告(2026年4月最新版) - 亨得利官方服务中心
  • 2026AIGC 短剧出海全链路落地服务测评
  • 2025届毕业生推荐的五大AI写作方案实测分析
  • wps的VBA小tips1
  • 如何快速使用MTKClient:联发科设备救砖与调试的完整指南
  • 虾友见面会 | Comake Pi × ZeroClaw部署实战沙龙开放报名
  • OpenCore Legacy Patcher老Mac升级指南:从硬件评估到系统优化的完整流程
  • 绝区零一条龙:AI驱动的游戏体验革新工具
  • emptydir存储对应宿主机存储位置
  • 快速上手:使用Git管理南北阁Nanbeige 4.1-3B的微调与部署版本
  • PowerShell-7.5.0-win-x64
  • 项目经理必看:被领导批评后如何用向上管理化危机为转机
  • AI检索——基础 RAG vs. 检索 Agent对比
  • 降AI工具为什么比自己改效果好?从算法角度解读 - 我要发一区
  • 如何完全掌握微信聊天数据:WeChatMsg免费工具的终极指南
  • 脚本-FX Console 搜索效果
  • 鸿蒙跨设备互通:让你的应用“借用“另一台设备的相机和图库
  • Pixel Dream Workshop保姆级教程:从Docker拉取到内存流导出全流程
  • Luogu P1809 过河问题
  • 2026年泉州代理记账报税公司性价比排名,为你精选优质企业 - myqiye
  • 2025届毕业生推荐的五大AI科研工具推荐
  • vscode的if结尾提示插件“If End Marker”实现了if结尾提示功能
  • Typora标题自动编号完全指南-零代码基础实现自动化文档结构
  • 3分钟解锁B站直播自由:第三方推流工具实战指南
  • 实战演练:借助快马AI快速构建Spring Boot博客系统核心模块
  • NoSleep防休眠工具:让系统持续运行的轻量级解决方案
  • Vue3 + TS + Canvas + Pretext 实现虚拟表格
  • [特殊字符] Agent Lightning:点亮你的AI代理!⚡
  • Kubernetes Service Mesh 深入解析:构建微服务通信的“智能交通网”