二叉树的几道题

发布时间:2026/7/21 5:56:58

二叉树的几道题
最大二叉树。先要找到数组中最大的值和对应的下标 最大的值构造根节点下标用来下一步分割数组。最大值所在的下标左区间 构造左子树 递归左子树最大值所在的下标右区间 构造右子树 递归右子树/** * 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; } };如果是搜索树这种题都一个套路和前面的二叉搜索树的最小绝对差一样左和右只需要递归写一个函数就行。在中间点的处理上再写真正的处理流程。

相关新闻

U盘数据丢失恢复全攻略:10种实用方法与避坑指南

U盘数据丢失恢复全攻略:10种实用方法与避坑指南

2026/7/21 5:56:58

1. U盘数据丢失的常见场景与恢复原理 U盘作为便携存储设备,在日常使用中难免会遇到数据丢失的情况。先说说我这些年遇到最多的几种数据丢失场景: 误删除 :这是最常见的情况,特别是批量选择文件时容易手滑误删重要文档。上周就有…

【LLM】一文讲透 AI Agent:从概念到四大核心组件

【LLM】一文讲透 AI Agent:从概念到四大核心组件

2026/7/21 5:56:58

Agent 到底是什么? 这两年,“Agent” 无疑是 AI 领域最高频的词汇之一。很多人对它有一个模糊的认知,知道它比普通 AI 更强大,但真要准确定义,又往往说不清楚。 抛开晦涩的学术定义,我们可以用一个生活化的…

Java面试转型:从八股文到场景实战的系统性应对策略

Java面试转型:从八股文到场景实战的系统性应对策略

2026/7/21 5:56:57

最近和不少准备秋招、面试的朋友交流,发现一个明显的趋势:Java面试的“玩法”真的变了。过去那种背熟“八股文”就能轻松过关的日子一去不复返。现在的面试官,越来越喜欢从你简历上的项目出发,层层深入,用一个个真实的…

基于springboot的自助洗车店运营系统设计

基于springboot的自助洗车店运营系统设计

2026/7/21 16:27:42

目 录 摘 要 Abstract 1 绪论 1.1 选题依据及意义 1.2 国内外研究现状 1.3论文结构安排 2 开发环境与技术 2.1 MySQL数据库 2.2 B/S结构 2.3 Vue.js框架 2.4 SpringBoot框架 3 系统分析 3.1可行性分析 3.2系统性能分析 3.3 系统流程和逻辑 3.…

Alfred-Convert自定义单位教程:添加个性化转换规则

Alfred-Convert自定义单位教程:添加个性化转换规则

2026/7/21 16:27:42

Alfred-Convert自定义单位教程:添加个性化转换规则 【免费下载链接】alfred-convert Convert between different units in Alfred 项目地址: https://gitcode.com/gh_mirrors/al/alfred-convert Alfred-Convert是一款强大的单位转换工具,能帮助用…

基于spring boot的再生资源回收平台

基于spring boot的再生资源回收平台

2026/7/21 16:27:42

目 录 摘 要 Abstract 1绪 论 1.1 研究背景 1.2 研究现状 1.3 研究目的与内容 1.4 技术概述 1.4.1开发框架 1.4.2 Vue 1.4.3 MySQL 1.4.4 SpringBoot 1.5 论文结构安排 2系统分析 2.1需求分析 2.1.1功能需求分析 2.2非功能需求分析 2.2.1性能…

Android-Smart-Login发布指南:从开发到上线的完整流程

Android-Smart-Login发布指南:从开发到上线的完整流程

2026/7/21 16:27:42

Android-Smart-Login发布指南:从开发到上线的完整流程 【免费下载链接】Android-Smart-Login A smart way to add Login functionality to your Android app. 项目地址: https://gitcode.com/gh_mirrors/an/Android-Smart-Login 想要为你的Android应用快速集…

GSYRickText完全指南:打造媲美微博的富文本编辑体验,支持Emoji、@人与话题功能

GSYRickText完全指南:打造媲美微博的富文本编辑体验,支持Emoji、@人与话题功能

2026/7/21 16:27:42

GSYRickText完全指南:打造媲美微博的富文本编辑体验,支持Emoji、人与话题功能 【免费下载链接】GSYRickText 类似微博的emoji表情、人、话题等的EdiText,优化了编辑框中的光标点击和删除处理。TextView支持emoji表情、话题、链接、电话和某人…

Dockerless:不跑测试、不搭环境,也能给 Coding Agent 的修复打分?

Dockerless:不跑测试、不搭环境,也能给 Coding Agent 的修复打分?

2026/7/21 16:17:41

做 Coding Agent 训练和研发的团队,大概都绕不开一个又脏又累的环节:搭环境。不管是给 SFT 筛选高质量轨迹,还是给 RL 提供奖励信号,都需要一个 verifier(验证器)来判断 Agent 生成的 patch 是否真正解决了…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/21 5:45:57

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/21 9:56:14

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵(连锁便利店/商超标准配置) 自助收银Kiosk一体机:顾客结算、自助核销优惠券、商品素材预览;运营折叠平板:店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/21 3:09:32

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…

GraphRAG Local + Ollama:微软知识图谱本地化

GraphRAG Local + Ollama:微软知识图谱本地化

2026/7/21 0:06:35

普通 RAG 有个老毛病:你问它「这堆文档整体在讲什么」,它答不上来。因为它只会把问题切成向量,去几十个文本块里捞最相似的几段拼给模型看。可「整体讲什么」这种问题,答案根本不在任何单独一段里——它散在全篇的联系里。 微软的…

AI 数据产品化思考:让分析能力变成可售卖的数据服务

AI 数据产品化思考:让分析能力变成可售卖的数据服务

2026/7/21 0:06:35

AI 数据产品化思考:让分析能力变成可售卖的数据服务 大家好,我是朱大喜。这周一直在复盘具体的项目和技术,最后一篇聊点不一样的东西——数据产品化。做了这么多年数据分析,我发现一个规律:能卖出去的从来不是"分…

基于人机协作的 AI 研发新体系架构:从 Harness 工程到 Loop 工程实践

基于人机协作的 AI 研发新体系架构:从 Harness 工程到 Loop 工程实践

2026/7/21 0:06:35

本文完整呈现了企业级 AI Coding 落地的核心方法论:从 Harness 工程的微观/宏观定义,到 Loop 工程的六大构建模块,再到基于 SDD(规范驱动开发)的工程化落地路径。干货较多,建议收藏细读。 我从 22 年开始就…