二叉树的几道题
最大二叉树。先要找到数组中最大的值和对应的下标 最大的值构造根节点下标用来下一步分割数组。最大值所在的下标左区间 构造左子树 递归左子树最大值所在的下标右区间 构造右子树 递归右子树/** * 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: TreeNode* constructMaximumBinaryTree(vectorint nums) { TreeNode*nodenew TreeNode(0); if(nums.size()1){ node-valnums[0]; return node; } int maxnum0; int maxindex0; for(int i0;inums.size();i){ if(nums[i]maxnum){ maxnumnums[i]; maxindexi; } } node-valmaxnum;//这里要判断最大值的位置,不是开头结尾。 if(maxindex0){ vectorintleftree(nums.begin(),nums.begin()maxindex); node-leftconstructMaximumBinaryTree(leftree); } if(maxindexnums.size()-1){ vectorintrightree(nums.begin()maxindex1,nums.end()); node-rightconstructMaximumBinaryTree(rightree);} return node; } };如果最大值在开头结尾会是什么情况代码里巧妙地用了两个if条件来保护切割操作这就是它能“存活”下来的原因。这里一开始我没想到导致代码报错。情况 1最大值在开头maxindex 0假设数组为nums [5, 1, 3]最大值 5 在索引 0。根节点node-val 5。左子树判断if(maxindex 0)→0 0为假。不会创建leftree也不会调用递归。结果node-left保持构造函数里的默认值nullptr空。这是正确的因为根节点左边没有元素了。右子树判断if(maxindex nums.size()-1)→0 2为真。创建rightree范围是nums.begin()01到end即[1, 3]。递归去构建右子树。最终树结构5没有左孩子只有右子树。情况 2最大值在结尾maxindex nums.size() - 1假设数组为nums [1, 3, 5]最大值 5 在索引 2。根节点node-val 5。左子树判断if(maxindex 0)→2 0为真。创建leftree范围是begin到begin2即[1, 3]。递归去构建左子树。右子树判断if(maxindex nums.size()-1)→2 2为假。不会创建rightree也不会调用递归。结果node-right保持默认的nullptr。这是正确的因为根节点右边没有元素了。最终树结构5没有右孩子只有左子树。如果有负数怎么找最大值INT_MIN极小值INT_MAX极大值合并二叉树这道题逻辑代码非常简单但是巧妙地借助了第一棵树作为载体而不是新建一棵树class Solution { public: TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) { if(root1NULL)return root2;//当它返回 t2 时它不再关心 t2 下面有什么直接整个挂过去。这在逻辑上阻止了对该分支的进一步递归。这就是为什么深度是有限的。 if(root2NULL)return root1; // 前序遍历 root1-val root2-val;//根 root1-leftmergeTrees(root1-left,root2-left);//左 root1-rightmergeTrees(root1-right,root2-right); return root1; } };700.二叉搜索树中的搜索确定终止条件如果root为空或者找到这个数值了就返回root节点。if (root NULL || root-val val) return root;确定单层递归的逻辑看看二叉搜索树的单层递归逻辑有何不同。因为二叉搜索树的节点是有序的所以可以有方向的去搜索。如果root-val val搜索左子树如果root-val val就搜索右子树最后如果都没有搜索到就返回NULL。代码如下TreeNode* result NULL; if (root-val val) result searchBST(root-left, val); if (root-val val) result searchBST(root-right, val); return result;很多录友写递归函数的时候 习惯直接写searchBST(root-left, val)却忘了 递归函数还有返回值。递归函数的返回值是什么? 是 左子树如果搜索到了val要将该节点返回。 如果不用一个变量将其接住那么返回值不就没了。所以要result searchBST(root-left, val)。总体代码如下class Solution { public: TreeNode* searchBST(TreeNode* root, int val) { if(rootNULL)return root; else if(root-valval)return root; else if(root-left!NULLroot-valval)return searchBST(root-left,val); else if(root-right!NULLroot-valval)return searchBST(root-right,val); return NULL; } };98.验证二叉搜索树中序遍历输出成了一个数组。class Solution { private: vectorintvec; public: void isValid(TreeNode* cur){ if(curNULL)return; isValid(cur-left); vec.push_back(cur-val); isValid(cur-right);//中序遍历可以用纸画一画 } bool isValidBST(TreeNode* root) { isValid(root); int sizevec.size(); for(int i1;isize;i){ if(vec[i-1]vec[i])return false; } return true; } };530.二叉搜索树的最小绝对差我最简单的思路和上一道题一样随便怎么遍历记录一个数组sort一下再相减不就行了答这样是对的但是题解给了一个更简单的方法因为这个搜索树大小排列时有序的所以直接用中序遍历两两一前一后比就行。class Solution { public: int result INT_MAX; TreeNode* pre NULL; void getmin(TreeNode*cur){ if(curNULL)return; getmin(cur-left); // 左 if(pre!NULL){ resultmin(result,abs(cur-val-pre-val));//后减去前 } precur; getmin(cur-right); } int getMinimumDifference(TreeNode* root) { getmin(root); return result; } };“不知道该看谁”是递归入门前最大的障碍。递归怎么看DeepSeek108. 将有序数组转换为二叉搜索树class Solution { public: TreeNode* sort(vectorint nums,int left,int right){//这里要用逗号不能用分号 if(leftright)return nullptr; int mid(leftright)/2; TreeNode*rootnew TreeNode(nums[mid]); root-leftsort(nums,left,mid-1); root-rightsort(nums,mid1,right); return root; } TreeNode* sortedArrayToBST(vectorint nums) { return sort(nums,0,nums.size()-1); } };if(leftright)return nullptr;这一行有什么用DeepSeek501.二叉搜索树中的众数力扣题目链接如果是搜索树怎么做如果不是搜索树怎么做如果不是搜索树遍历一遍用map统计最大值然后输出。class Solution { public: // 1. 定义哈希表统计每个数字出现的次数 unordered_mapint, int freq; // 2. 前序遍历中序后序都行把每个节点的值统计进哈希表 void dfs(TreeNode* root) { if (root nullptr) return; freq[root-val]; // 统计当前节点 dfs(root-left); dfs(root-right); } vectorint findMode(TreeNode* root) { vectorint result; if (root nullptr) return result; // 3. 遍历整棵树填充 freq 哈希表 dfs(root); // 4. 找出众数出现的最大次数频率 int maxCount 0; for (auto pair : freq) { if (pair.second maxCount) { maxCount pair.second; } } // 5. 找出所有出现次数 maxCount 的数字加入结果 for (auto pair : freq) { if (pair.second maxCount) { result.push_back(pair.first); } } return result; } };如果是搜索树这种题都一个套路和前面的二叉搜索树的最小绝对差一样左和右只需要递归写一个函数就行。在中间点的处理上再写真正的处理流程。

相关新闻

C++编程实战指南:从环境搭建到性能优化,掌握现代C++核心技能

C++编程实战指南:从环境搭建到性能优化,掌握现代C++核心技能

1. 从“Hello World”到系统级编程:为什么C依然无可替代?如果你在搜索引擎里敲下“C教程”,大概率会看到两种极端:一种是“三天速成C”的营销号,另一种是动辄上千页、充满晦涩术语的“天书”。这恰恰反映了C的现状——…

2026/7/21 5:54:47阅读更多 →
C++多线程编程中锁粒度选择:从粗到细的性能优化策略与实践

C++多线程编程中锁粒度选择:从粗到细的性能优化策略与实践

1. 项目概述:锁粒度选择的十字路口 在C多线程编程的世界里,锁是协调并发访问、保护共享数据的基石。但锁用不好,性能瓶颈就来了。很多开发者,尤其是从单线程思维过渡过来的,最容易犯的错误就是“一把大锁走天下”——用…

2026/7/21 5:54:47阅读更多 →
Unity Addressable资源系统实战:从动态加载到热更新的完整指南

Unity Addressable资源系统实战:从动态加载到热更新的完整指南

1. 项目概述:为什么我们需要Addressable? 如果你在Unity项目里做过资源管理,大概率经历过这样的场景:项目初期,所有资源一股脑塞进Resources文件夹,打包后APK/EXE体积巨大,每次更新哪怕只改一张…

2026/7/21 5:54:47阅读更多 →
家教管理系统素材

家教管理系统素材

WY上海260704002B 【地址】浦东沈杜公路附近 【科目】英语 【学员】初一,男,升初二,一对一老师上门。 【时间】一周2次,一次2小时 【教员】男女不限老师,有家教经验,有责任心。最好是已经毕业的大学生 【薪…

2026/7/21 15:57:40阅读更多 →
OpenCV-Python实战(20)——OpenCV计算机视觉项目在Web端的部署

OpenCV-Python实战(20)——OpenCV计算机视觉项目在Web端的部署

OpenCV-Python实战(20)——OpenCV计算机视觉项目在Web端的部署 0. 前言 1. Python Web 框架简介 2. Flask 安装与使用 2.1 Flask 安装 2.2 Flask 框架 Hello World 使用示例 2.3 扩展 Hello World 应用程序以在网络中其他计算机访问 2.4 扩展 Hello World 应用程序以绑定其它…

2026/7/21 15:57:40阅读更多 →
云台 学习笔记

云台 学习笔记

1.云台控制基本任务:控制相机坐标系跟踪世界坐标系2.yaw计算:与惯性坐标系z轴垂直的电机轴旋转不影响偏航角计算,将电机轴投影到惯性坐标系的z轴上,在roll和pitch稳定的前提下,pitch轴电机轴旋转对偏航完全没影响&…

2026/7/21 15:57:40阅读更多 →
如何在5分钟内集成Simple-Unity-Audio-Manager到你的Unity项目

如何在5分钟内集成Simple-Unity-Audio-Manager到你的Unity项目

如何在5分钟内集成Simple-Unity-Audio-Manager到你的Unity项目 【免费下载链接】Simple-Unity-Audio-Manager A decentralized audio playing system for Unity, designed for simplicity and built to scale! 项目地址: https://gitcode.com/gh_mirrors/si/Simple-Unity-Aud…

2026/7/21 15:57:40阅读更多 →
如何评估ChatGLM微调效果?ChatGLM-finetune-LoRA的损失曲线分析与调参指南

如何评估ChatGLM微调效果?ChatGLM-finetune-LoRA的损失曲线分析与调参指南

如何评估ChatGLM微调效果?ChatGLM-finetune-LoRA的损失曲线分析与调参指南 【免费下载链接】ChatGLM-finetune-LoRA 项目地址: https://gitcode.com/gh_mirrors/ch/ChatGLM-finetune-LoRA ChatGLM-finetune-LoRA是一个基于LoRA技术对ChatGLM模型进行高效微调…

2026/7/21 15:57:40阅读更多 →
OpenCV-Python实战(12)——一文详解AR增强现实

OpenCV-Python实战(12)——一文详解AR增强现实

OpenCV-Python实战(12)——一文详解AR增强现实 0. 前言 1. 增强现实简介 2. 基于无标记的增强现实 2.1 特征检测 2.2 特征匹配 2.3 利用特征匹配和单应性计算以查找对象 3. 基于标记的增强现实 3.1 创建标记和字典 3.2 检测标记 3.3 相机校准 3.4 相机姿态估计 3.5 增强现实初…

2026/7/21 15:55:40阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 0:51:49阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 0:51:49阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 0:51:49阅读更多 →
Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

📌教程适配:OpenClaw v2.7.9 | 兼容 Windows10/11、macOS 双系统 📖前言 当下各类本地 AI 工具层出不穷,多数产品仅能完成文字问答交互,很难直接操控电脑执行实际操作。OpenClaw,业内常称小龙虾 AI&#…

2026/7/21 0:01:46阅读更多 →
Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

聊《一次Codex项目复盘,问题最后出在流程而不是模型》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做&…

2026/7/21 0:01:46阅读更多 →
手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

大家好,还是我。前几期带大家做了心情日记本和可视化大屏,后台有朋友留言:“能不能教点好玩的?我想做游戏,但一行代码都不会。”行,这期就安排。今天的目标:从零做一个五子棋游戏。 带AI对战、三…

2026/7/21 0:03:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/20 22:51:39阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/20 18:51:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/20 18:51:18阅读更多 →