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

654.最大二叉树

题目链接:654.最大二叉树

给定一个不重复的整数数组 nums最大二叉树 可以用下面的算法从 nums 递归地构建:

  1. 创建一个根节点,其值为 nums 中的最大值。
  2. 递归地在最大值 左边子数组前缀上 构建左子树。
  3. 递归地在最大值 右边子数组后缀上 构建右子树。

返回 nums 构建的 最大二叉树

文章讲解/视频讲解:https://programmercarl.com/0654.%E6%9C%80%E5%A4%A7%E4%BA%8C%E5%8F%89%E6%A0%91.html

思路

采用递归的方式处理。

在当前递归处理中,找到目前下标范围 [ l e f t , r i g h t ] [left, right] [left,right]内的最大值的下标 m a x I d x maxIdx maxIdx,以该位置的值建立当前子树的头节点,然后递归地将 [ l e f t , m a x I d x − 1 ] [left, maxIdx-1] [left,maxIdx1]范围内的递归结果作为左子树,将 [ m a x I d x + 1 , r i g h t ] [maxIdx+1, right] [maxIdx+1,right]范围内的递归结果作为右子树。

C++实现

class Solution {
public:TreeNode* constructMaximumBinaryTree(vector<int>& nums) {return Traversal(nums, 0, nums.size() - 1);}TreeNode* Traversal(const vector<int>& nums, int left, int right){if(left > right) return nullptr;int maxIdx = left;for(int i = left;i<=right;i++){if(nums[i] > nums[maxIdx]){maxIdx = i;}}TreeNode* head = new TreeNode(nums[maxIdx]);head->left = Traversal(nums, left, maxIdx - 1);head->right = Traversal(nums, maxIdx + 1, right);return head;}
};

617.合并二叉树

题目链接:617.合并二叉树

给你两棵二叉树: root1root2

想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。

返回合并后的二叉树。

注意: 合并过程必须从两个树的根节点开始。

文章讲解/视频讲解:https://programmercarl.com/0617.%E5%90%88%E5%B9%B6%E4%BA%8C%E5%8F%89%E6%A0%91.html

思路

利用递归来实现,让两棵树root1和root2同时前序遍历。

每次递归过程中,只有两棵树当前节点均为nullptr时才直接return,否则按照题目规则,如果两棵树当前节点均不为空,则将两个节点的值累加,利用累加值构建新树的节点,如果只有一棵树当前节点不为空,则用这个不为空的节点的值构建新树的节点。

C++实现

class Solution {
public:TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {if(root1 == nullptr && root2 == nullptr) return nullptr;int cur_val;if(root1 != nullptr && root2 != nullptr){cur_val = root1->val + root2->val;}else if(root1 != nullptr && root2 == nullptr){cur_val = root1->val;}else{cur_val = root2->val;}TreeNode* cur = new TreeNode(cur_val);cur->left = mergeTrees(root1 == nullptr ? nullptr : root1->left, root2 == nullptr ? nullptr : root2->left);cur->right = mergeTrees(root1 == nullptr ? nullptr : root1->right, root2 == nullptr ? nullptr : root2->right);return cur;}
};

700.二叉搜索树中的搜索

题目链接:700.二叉搜索树中的搜索

给定二叉搜索树(BST)的根节点 root 和一个整数值 val

你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null

文章讲解/视频讲解:https://programmercarl.com/0700.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E6%90%9C%E7%B4%A2.html

思路

可采用最基本的递归查询。

因为root是一棵二叉搜索树,在每一次递归判断过程中,如果val等于当前子树的节点值,则直接返回该节点;如果val小于当前子树的节点值,则递归往当前子树的左子树寻找;如果val大于当前子树的节点值,则递归往当前子树的右子树寻找。如果最终没有找到,返回空指针。

C++实现

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

98.验证二叉搜索树

题目链接:98.验证二叉搜索树

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

文章讲解/视频讲解:https://programmercarl.com/0098.%E9%AA%8C%E8%AF%81%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html

思路

总体上用递归的方式来处理。

对于当前子树cur,如何判断cur是一棵二叉搜索树呢?cur比它左子树中所有的节点值大,比右子树中所有的节点值小;或者,cur是空节点或叶子节点。

那么如何找到cur左子树中值最大的节点?如果cur的左子树已经是二叉搜索树,那么cur左子树中值最大的节点是cur左子树中最右边的节点。

寻找cur右子树中值最小的节点同理,如果cur的右子树已经是二叉搜索树,那么cur右子树中值最大的节点是cur右子树中最左边的节点。

C++实现

class Solution {
public:int findRight(TreeNode* node){while(node->right) node = node->right;return node->val;}int findLeft(TreeNode* node){while(node->left) node = node->left;return node->val;}bool isValidBST(TreeNode* root) {if(!root || (!root->left && !root->right)) return true;bool left_success = isValidBST(root->left);bool right_success = isValidBST(root->right);if(!left_success || !right_success) return false;return (!root->left || root->val > findRight(root->left)) && (!root->right || root->val < findLeft(root->right));}
};

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

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

相关文章

Apache Flink连载(二十三):Flink HA - Flink基于Yarn HA

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. Yarn HA配置 ​​​​…

Cache替换算法

由于Cache很小&#xff0c;主存很大&#xff0c;Cache很容易装满&#xff0c;Cache满了怎么办&#xff1f; ——采用替换算法。 全相联映射&#xff1a;Cache完全满了才需要替换&#xff0c;需要在全局中选择替换哪一块。直接映射&#xff1a;如果对应位置非空&#xff0c;则…

linux线程与进程

简要 在Linux系统中&#xff0c;进程&#xff08;Process&#xff09;和线程&#xff08;Thread&#xff09;是操作系统中两个重要的概念&#xff0c;它们都是用于执行程序的执行单元&#xff0c;但有一些关键的区别。 在Linux系统中&#xff0c;可以使用fork系统调用创建新…

Vue3-30-路由-嵌套路由的基本使用

什么是嵌套路由 嵌套路由 &#xff1a;就是一个组件内部还希望展示其他的组件&#xff0c;使用嵌套的方式实现页面组件的渲染。 就像 根组件 通过路由渲染 普通组件一样&#xff0c;嵌套路由也是一样的道理。 嵌套路由的相关关键配置 1、<router-view> 标签 声明 被嵌套组…

在 Spring 中操作 Redis

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对博主首页也很感兴趣o (ˉ▽ˉ&#xff1b;) &#x1f4dc;redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿 目录 1、引入依赖 2、对 Redis 的配置文件进行书写 3、S…

kivy PageLayout 的说明及例子

PageLayout 是 Kivy GUI 框架中的一个布局管理器&#xff0c;它允许开发者在同一个窗口中放置多个页面&#xff0c;用户可以通过滑动来浏览这些页面。PageLayout 的工作方式类似于一个可以滑动的标签页&#xff08;TabbedPanel&#xff09;&#xff0c;但其页面可以自由调整大小…

【Python_PySide2学习笔记(二十二)】进度对话框QProgressDialog类的基本用法

进度对话框QProgressDialog类的基本用法 进度对话框QProgressDialog类的基本用法前言一、QProgressDialog 的常用方法1、创建进度对话框2、进度对话框设置窗口标题3、进度对话框隐藏"最大化"、"最小化"、"关闭"4、进度对话框设置是否自动关闭5、…

Atlas Hook 导入 Hive 元数据

Atlas 部署之后就可以导入 Hive 元数据&#xff0c;这部分工作由 Atlas 组件 Hook 来完成。初次导入 Hive 元数据需要通过执行 shell 脚本来完成&#xff0c;然后&#xff0c;Atlas 就可以自动同步增量元数据信息了。下面我介绍一下如何完成这些工作。 初次导入 Hive 元数据 …

LLM、AGI、多模态AI 篇一:开源大语言模型简记

文章目录 系列开源大模型LlamaChinese-LLaMA-AlpacaLlama2-ChineseLinlyYaYiChatGLMtransformersGPT-3(未完全开源)BERTT5QwenBELLEMossBaichuan

使用Py2neo进行Neo4j图数据库的增删改查操作

使用Py2neo进行Neo4j图数据库的增删改查操作 Neo4j 是一个高效的图形数据库管理系统&#xff0c;它将数据结构存储为图形而非表格。Py2neo 是一个客户端库&#xff0c;用于使用 Python 语言与 Neo4j 交互。它提供了一系列简单易用的 API&#xff0c;使得在 Python 中进行图形数…

Linux常用命令大全总结及讲解(超详细版)

前言&#xff1a; Linux 是一个基于Linux 内核的开源类Unix 操作系统&#xff0c;Linus Torvalds于 1991 年 9 月 17 日首次发布的操作系统内核。Linux 通常打包为Linux 发行版。 Linux 最初是为基于Intel x86架构的个人计算机开发的&#xff0c;但此后被移植到的平台比任何其…

K8S 中对 Windows 节点的利用

目录 漏洞概述 漏洞详情 ​编辑 漏洞验证 补丁分析 在集群中探索 参考资料 在许多组织中&#xff0c;所运行的很大一部分服务和应用是 Windows 应用。Windows 容器提供了一种封装进程和包依赖项的方式&#xff0c;从而简化了 DevOps 实践&#xff0c;令 Windows 应用程序…

【xdma】 pcie.bar设置

FPGA优质开源项目– PCIE通信 xdma 两者保持一致 FPGA开源项目 – PCIE I/O控制卡 xdma PCIe的XDMA应用 读写部分分为两种&#xff0c;一种是数据的读写&#xff0c;另一种是配置数据的读写&#xff0c;在数据读写部分&#xff0c;DMA通过MIG控制DDR完成数据读写。配置数据…

2023年终总结及计划

2023年在今晚就要过去&#xff0c;唯一的感受就一个字&#xff1a;快&#xff01;还没什么感觉就过去了。今年总体感觉自己在忙忙碌碌&#xff0c;为了某个节点冲刺熬夜加班&#xff0c;但是最终收获甚微。夜深人静&#xff0c;又该到了静下来想想的时候了。 一、收获 1、生活…

使用 Tkinter 制作一个进制转换工具,好用!

在平时工作学习当中&#xff0c;我们经常会编写一些简单的 Python GUI 工具&#xff0c;以此来完成各种各样的自动化任务&#xff0c;比如批量处理文件&#xff0c;批量处理图片等等。当我们进行这些工具的编写之时&#xff0c;往往只关注了功能的实现&#xff0c;而忽略了页面…

加速写代码的板子

加速写代码的板子 计算中位数整合字符串 计算中位数 先说结论&#xff0c;无论数组总个数n为奇数还是偶数&#xff0c;都可以用下式表示 n u m s [ n / 2 ] 和 n u m s [ ( n − 1 ) / 2 ] nums[n/2] 和nums[(n-1)/2] nums[n/2]和nums[(n−1)/2] 当n 4时为nums[2]与nums[1] …

基于Docker的软件环境部署脚本,持续更新~

使用时CtrlF搜索你想要的环境&#xff0c;如果没有你想要的环境&#xff0c;可以评论留言&#xff0c;会尽力补充。 本文提供的部署脚本默认参数仅适合开发测试&#xff0c;请根据实际情况调节参数。 数据库 MySQL version: 3.9 services:mysql:image: mysql:8.0.35container…

Android 软键盘的显示和隐藏

文章目录 Android 软键盘的显示和隐藏核心方法软键盘工具类点击空白区域隐藏软键盘方式一方式二 Android 软键盘的显示和隐藏 核心方法 显示软键盘&#xff1a; InputMethodManager#showSoftInput(View view, int flags)隐藏软键盘&#xff1a; InputMethodManager#hideSof…

【Unity美术】Unity工程师对3D模型需要达到的了解【二】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

python使用句柄控制windows窗口

方法一&#xff1a;通过类名和标题搜索窗体并返回句柄&#xff0c;以整个windows窗口开始查找 hwnd win32gui.FindWindow(lpClassNameNone, lpWindowNameNone) hwnd win32gui.FindWindow(None,命令提示符) 方法二&#xff1a;从给定的子窗口之后开始&#xff0c;比如给定…