leetcode654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索

654.最大二叉树

构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树

  • 确定递归函数的参数和返回值

参数传入的是存放元素的数组,返回该数组构造的二叉树的头结点,返回类型是指向节点的指针。

TreeNode* constructMaximumBinaryTree(vector<int>& nums)
  • 确定终止条件

题目中说了输入的数组大小一定是大于等于1的,所以我们不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了

那么应该定义一个新的节点,并把这个数组的数值赋给新的节点,然后返回这个节点。 这表示一个数组大小是1的时候,构造了一个新的节点,并返回

TreeNode* node = new TreeNode(0);
if (nums.size() == 1) {node->val = nums[0];return node;
}
  • 确定单层递归的逻辑

这里有三步工作

  1. 先要找到数组中最大的值和对应的下标, 最大的值构造根节点,下标用来下一步分割数组
int maxValue = 0;
int maxValueIndex = 0;
for (int i = 0; i < nums.size(); i++) {if (nums[i] > maxValue) {maxValue = nums[i];maxValueIndex = i;}
}
TreeNode* node = new TreeNode(0);
node->val = maxValue;
  1. 最大值所在的下标左区间 构造左子树
    这里要判断maxValueIndex > 0,因为要保证左区间至少有一个数值
if (maxValueIndex > 0) {vector<int> newVec(nums.begin(), nums.begin() + maxValueIndex);node->left = constructMaximumBinaryTree(newVec);
}
  1. 最大值所在的下标右区间 构造右子树
    判断maxValueIndex < (nums.size() - 1),确保右区间至少有一个数值
if (maxValueIndex < (nums.size() - 1)) {vector<int> newVec(nums.begin() + maxValueIndex + 1, nums.end());node->right = constructMaximumBinaryTree(newVec);
}

这样我们就分析完了,整体代码如下:(详细注释)

class Solution {
public:TreeNode* constructMaximumBinaryTree(vector<int>& nums) {TreeNode* node = new TreeNode(0);if(nums.size() == 1){node->val = nums[0];return node;} // 找到数组中最大的值和对应的下标int maxValue = nums[0];int maxValueIndex = 0;for(int i = 0; i < nums.size(); i++){if(maxValue < nums[i]){maxValue = nums[i];maxValueIndex = i;}}node->val = maxValue;// 最大值所在的下标左区间 构造左子树if(maxValueIndex > 0){vector<int> newVec(nums.begin(), nums.begin() + maxValueIndex);node->left = constructMaximumBinaryTree(newVec);}// 最大值所在的下标右区间 构造右子树if(maxValueIndex < nums.size() - 1){vector<int> newVec(nums.begin() + 1 + maxValueIndex, nums.end());node->right = constructMaximumBinaryTree(newVec);}return node;}

617.合并二叉树

使用队列,模拟的层序遍历,代码如下:

class Solution {
public:TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {if(root1 == NULL) return root2;if(root2 == NULL) return root1;queue<TreeNode*> que;que.push(root1);que.push(root2);while(!que.empty()){TreeNode* node1 = que.front();que.pop();TreeNode* node2 = que.front();que.pop();node1->val += node2->val;if(node1->left != NULL && node2->left != NULL){que.push(node1->left);que.push(node2->left);}if(node1->right != NULL && node2->right != NULL){que.push(node1->right);que.push(node2->right);}if(node1->left == NULL && node2->left != NULL){node1->left = node2->left;}if(node1->right == NULL && node2->right != NULL){node1->right =node2->right;}}return root1;}
};

700.二叉搜索树中的搜索

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/13686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity 开发Hololens,制作面板跟随眼镜一起移动,(面板跟踪)

Hololens滑动框以及面板跟踪 创建空物体&#xff0c;并添加组件 SolverHandler、RedialView、FollowMeToggle 创建按钮&#xff0c;控制停止/开始跟踪 创建一个Hololens自带的按钮放到右上角&#xff0c;并添加事件 创建蓝色背景板 创建空物体Backplate&#xff0c;下面再…

个体因果效应估计|EDVAE:用于个体治疗效果估计的反事实推理中的解开潜在因素模型

【摘要】根据观察数据估计个体治疗效果&#xff08;ITE&#xff09;是一项至关重要但具有挑战性的任务。解缠结表示已用于将代理变量分为混杂变量、工具变量和调整变量。然而&#xff0c;根据观测数据准确地进行反事实推理来识别 ITE 仍然是一个悬而未决的问题。在本文中&#…

AppInventor2要在界面上做一个电量图标,有什么好的思路吗?

问&#xff1a;要在界面上做一个电量图标&#xff0c;有什么好的思路吗&#xff1f; 答&#xff1a;首先&#xff0c;很容易想到使用进度条相关的组件&#xff0c;原生”滑动条“组件可以吗&#xff1f; 答案显而易见&#xff0c;首先它的样式自定义不够&#xff0c;UI不外乎上…

STM32_ADC

1、ADC简介 ADC&#xff0c;即Analog-Digital Converter&#xff0c;模拟-数字转换器。 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁。 12位逐次逼近型ADC&#xff0c;1us转换时间。 输入电压范围&#xff1a;0~3.3…

P6【力扣144,94,145】【数据结构】【二叉树遍历】C++版

【144】二叉树的前序遍历 1、递归法&#xff1a; class Solution { public:void preorder(TreeNode* root, vector<int> &res){if(root nullptr){return;}res.push_back(root->val);preorder(root->left, res);preorder(root->right, res);}vector<in…

没有密码如何卸载卡巴斯基?

如果忘记卡巴斯基6.0的保护密码&#xff0c; &#xff08;1&#xff09;进入安全模式下 &#xff08;2&#xff09;打开6.0的安装目录 Kaspersky Anti-Virus 6.0: C://Program Files//Kaspersky Lab//Kaspersky Anti-Virus 6.0 &#xff08;3&#xff09;将目录中的avp.exe改…

CVE-2020-7982 OpenWrt 远程命令执行漏洞学习(更新中)

OpenWrt是一款应用于嵌入式设备如路由器等的Linux操作系统。类似于kali等linux系统中的apt-get等&#xff0c;该系统中下载应用使用的是opgk工具&#xff0c;其通过非加密的HTTP连接来下载应用。但是其下载的应用使用了SHA256sum哈希值来进行检验&#xff0c;所以将下载到的数据…

开发过程中使用MySQL和Oracle的差异

前言 小型项目中使用MySQL的占比还是相对较高的&#xff0c;但是也不排除随着项目的扩大&#xff0c;产品的丰富&#xff0c;或者甲方的财大气粗&#xff0c;有可能会有MySQL换成Oracle。那么这两者对于开发者而言&#xff0c;有什么差异化的地方呢。 官方文档 MySQL5.7 htt…

weblogic简介

WebLogic是美国Oracle公司出品的一个Application Server&#xff0c;它是一个基于JAVA EE架构的中间件。WebLogic主要用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。它将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的…

什么是安全左移如何实现安全左移

文章目录 一、传统软件开发面临的安全挑战二、什么是安全左移四、安全左移与安全开发生命周期&#xff08;SDL&#xff09;三、安全左移对开发的挑战五、从DevOps到DevSecOps六、SDL与DevSecOps 一、传统软件开发面临的安全挑战 传统软件开发面临的安全挑战主要包括以下几个方…

yarn常用命令

Yarn 是一个快速、可靠且安全的依赖管理工具&#xff0c;用于替代 npm。以下是一些常用的 Yarn 命令&#xff0c;用于不同的包管理和项目依赖安装场景&#xff1a; 初始化一个新的项目 yarn init这个命令会引导你创建一个 package.json 文件。 安装依赖 yarn add [package]…

抄表:现代生活中的数据采集关键

1.界定与发源 抄表&#xff0c;简单的说&#xff0c;指从各种各样计量机器设备(如智能水表、电度表、天然气表等)载入做好记录使用量的全过程。这一概念自工业化时代至今就出现了&#xff0c;最初由人工进行&#xff0c;伴随着科技创新&#xff0c;如今已经演化出自动化和远程…

Java中的时间戳【详解】

一.何为Java时间戳 在Java中&#xff0c;时间戳通常指的是自1970年1月1日午夜&#xff08;UTC&#xff09;以来的毫秒数。 这个概念在Java中主要通过java.util.Date类和java.sql.Timestamp类来表示 而在Java 8及以后的版本中&#xff0c;引入了新的日期时间API&#xff0c;即…

给大家分享一套非常棒的python机器学习课程

给大家分享一套非常棒的python机器学习课程——《AI小天才&#xff1a;让小学生轻松掌握机器学习》&#xff0c;2024年5月完结新课&#xff0c;提供配套的代码笔记软件包下载&#xff01;学完本课程&#xff0c;可以轻松掌握机器学习的全面应用&#xff0c;复杂特征工程&#x…

【C++刷题】优选算法——递归第三辑

floodfill篇 图像渲染 unordered_multimap<int, int> direction {{0, 1},{0, -1},{1, 0},{-1, 0} }; void dfs(vector<vector<int>>& image, int sr, int sc, int color, int val) {image[sr][sc] color;for(auto& e : direction){int x sr e.…

关于微服务的一点感悟和过往经验的思考

一、为什么有微服务 解决单体应用的局限性 随着业务发展&#xff0c;业务逻辑复杂、关联方多&#xff0c;导致业务系统的代码臃肿、难于做迭代或者维护&#xff0c;导致很多的问题&#xff0c;如&#xff1a;bug多、难于维护修复、每次需要评估改动服务接口影响的范围&#xf…

碰撞器触发事件(OnTriggerEnter/OnTriggerStay/OnTriggerExit)

碰撞器触发事件&#xff08;OnTriggerEnter/OnTriggerStay/OnTriggerExit&#xff09;简介 在Unity中&#xff0c;触发器事件是当一个游戏对象进入、停留或离开另一个游戏对象的触发器碰撞器时发生的事件。这些事件分别是: OnTriggerEnter: 当其他Collider首次进入触发器时调用…

服务端Web资源缓存

1.前言 虽然客户端缓存效果很好&#xff0c;但它有一个核心问题&#xff1a;要在本地提供资源&#xff0c;必须先将其存储在缓存中。因此&#xff0c;每个客户端都需要其缓存的资源。如果请求的资源需要大量计算&#xff0c;则无法扩展。服务器端缓存背后的理念是计算一次资源…

【CAN】libsocketcan库详解

1、简介 libsocketcan是用户空间通过SocketCAN操作CAN的接口。 源码:https://github.com/linux-can/libsocketcan 2、API详解 2.1 can_do_restart 1)说明:重启CAN接口 2)原型: int can_do_restart(const char *name);3)参数: name:CAN接口名,比如:can0、can1,…

继续分析开发人员容易被骗的原因和防范措施

继续分析开发人员容易被骗的原因和防范措施&#xff0c;可以深入探讨一些具体的技术细节和实际操作建议&#xff0c;以更全面地理解和应对这一问题。 技术细节&#xff1a; 未加密的敏感数据传输&#xff1a; 原因&#xff1a;开发人员可能忽视了数据传输过程中的安全性&#…