代码随想录算法 - 二叉树4

news/2024/11/17 17:48:17/文章来源:https://www.cnblogs.com/code4log/p/18414543

题目1 654. 最大二叉树

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

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

返回 nums 构建的 *最大二叉树*

示例 1:

img

输入:nums = [3,2,1,6,0,5]
输出:[6,3,5,null,2,0,null,null,1]
解释:递归调用如下所示:
- [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5] 。- [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1] 。- 空数组,无子节点。- [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1] 。- 空数组,无子节点。- 只有一个元素,所以子节点是一个值为 1 的节点。- [0,5] 中的最大值是 5 ,左边部分是 [0] ,右边部分是 [] 。- 只有一个元素,所以子节点是一个值为 0 的节点。- 空数组,无子节点。

示例 2:

img

输入:nums = [3,2,1]
输出:[3,null,2,null,1]

提示:

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] <= 1000
  • nums 中的所有整数 互不相同

思路

递归法

这道题的出题人还挺好的,把解法都写在题目里了,按照给出的方法递归创建递归树就行了

代码

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

题目2 617. 合并二叉树

给你两棵二叉树: root1root2

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

返回合并后的二叉树。

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

示例 1:

img

输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]
输出:[3,4,5,5,4,null,7]

示例 2:

输入:root1 = [1], root2 = [1,2]
输出:[2,2]

提示:

  • 两棵树中的节点数目在范围 [0, 2000]
  • -104 <= Node.val <= 104

思路

递归法

进入递归函数时注意root1子树和root2子树的4种状态就能做了,1.两个子树全为空,则返回nullptr,2.root1子树为空,3.root2子树为空,4.两个子树都不为空,则进行当前节点的合并与处理双child节点。

代码

class Solution {
public:TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {if(root1 == nullptr)return root2;if(root2 == nullptr)return root1;if(root1 == nullptr && root2 == nullptr)return nullptr;root1->val += root2->val;root1->left = mergeTrees(root1->left, root2->left);root1->right = mergeTrees(root1->right, root2->right);return root1;}
};

题目3 700. 二叉搜索树中的搜索

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

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

示例 1:

img

输入:root = [4,2,7,1,3], val = 2
输出:[2,1,3]

示例 2:

img

输入:root = [4,2,7,1,3], val = 5
输出:[]

提示:

  • 树中节点数在 [1, 5000] 范围内
  • 1 <= Node.val <= 107
  • root 是二叉搜索树
  • 1 <= val <= 107

思路

基础题,考察二叉搜索树的查询操作,有递归法和迭代法。

递归法

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

迭代法

class Solution {
public:TreeNode* searchBST(TreeNode* root, int val) {if(!root->left && !root->right)return root->val == val ? root : nullptr;TreeNode* curNode = root;while(curNode){if(curNode->val == val)return curNode;curNode = curNode->val > val ? curNode->left : curNode->right;}return curNode;}
};

题目4 98. 验证二叉搜索树

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

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

  • 节点的左

    子树

    只包含

    小于

    当前节点的数。

  • 节点的右子树只包含 大于 当前节点的数。

  • 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

img

输入:root = [2,1,3]
输出:true

示例 2:

img

输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。

提示:

  • 树中节点数目范围在[1, 104]
  • -231 <= Node.val <= 231 - 1

思路

递归法

这道题主要是注意比当前节点大和比当前节点小的节点的位置是否正确,这个是陷阱,解决了这个就AC了。

代码

class Solution {
public:bool isValidBST(TreeNode* root) {if(!root->left && !root->right)return true;bool lft = true, rht = true;TreeNode * tmpNode = nullptr;if(root->left){lft = root->left->val < root->val && isValidBST(root->left);tmpNode = root->left;while(tmpNode->right){tmpNode = tmpNode->right;}lft = lft && tmpNode->val < root->val;}if(root->right){rht = root->right->val > root->val && isValidBST(root->right);tmpNode = root->right;while(tmpNode->left){tmpNode = tmpNode->left;}rht = rht && tmpNode->val > root->val;}return lft && rht;}
};

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

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

相关文章

图的连通性小记

前言 DFS 树 无向图 DFS 树 定义:DFS树 是在图或树结构上进行深度优先搜索时形成的树。在 DFS 过程中,从一个顶点开始,尽可能深地搜索图的分支,直到达到一个没有未访问邻居的顶点,然后回溯到上一个顶点继续搜索。 从点 \(r\) 开始搜索,每次进入一个点 \(i\) 对应的边 \((…

前端项目通过 Nginx 发布至 Linux,并通过 rewrite 配置访问后端接口

本文通过将 arco 框架的前端项目,部署至 CentOS 7,并访问同服务器的 WebAPI 接口,来简单演示一下,如何将前端项目发布至 Linux 系统。〇、前言 本文通过将 arco 框架的前端项目,部署至 CentOS 7,并访问同服务器的 WebAPI 接口,来简单演示一下,如何将前端项目发布至 Lin…

练习第四周8.31

作业: 1、安装burp并实现抓取HTTP站点的数据包(HTTPS站点暂时不要求)2、练习Tomcat PUT方法任意写文件漏洞(CVE-2017-12615),提供蚁剑连接成功截图3、练习S2-048 远程代码执行漏洞(CVE-2017-9791),提供命令执行截图 4、练习JBoss 5.x/6.x 反序列化漏洞(CVE-2017-1214…

【csp201912-2】回收站选址

题目背景开学了,可是校园里堆积了不少垃圾杂物。热心的同学们纷纷自发前来清理,为学校注入正能量~ 题目描述 通过无人机航拍我们已经知晓了n处尚待清理的垃圾位置,其中第i(1≤i≤n)处的坐标为(x,y),保证所有的坐标均为整数。我们希望在垃圾集中的地方建立些回收站。具体来说…

【Ehviewer绿色版】1.9.8.4最新版本下载2024安卓苹果

Ehviewer 是一款主要用于浏览和下载漫画、插画等二次元图像内容的软件。适用安卓和苹果系统,Ehviewer拥有海量的漫画作品,涵盖各种题材和风格,包括日本漫画、韩国漫画、欧美漫画以及国内的一些同人创作等。无论是热门的商业漫画还是小众的独立作品,都能在 Ehviewer上找到,…

uniapp - uView 组件库的u-button 不支持 @click.stop事件,会报错 - 解决

包一层view即可,点击事件不要写在按钮上 本文来自博客园,作者:岑惜,转载请注明原文链接:https://www.cnblogs.com/c2g5201314/p/18414452响应开源精神相互学习,内容良币驱除劣币

章13——常用类——包装类,Integer类

包装类ctrl + b 可以跳转源代码。char 和 boolean的继承体系:包装类和基本数据的转换//装箱int n = 200;Integer integer = n;//拆箱int n1 = integer;包装类练习题三元运算符中是一个整体,其中精度最高的是double,所以无论结果返回什么,都会提高obj1的精度。 包装类到Stri…

大模型应用开发初探 : 手搓一个简易Agent

本文简单介绍AI Agent的基本概念 和 工作方式,目前主要有两种开发Agent的模式,一种是高代码手搓,另一种是低代码拖拉拽。然后,通过C# + Semantic Kernel + 智谱LLM模型 演示了如何快速开发一个简易的AI Agent,虽然它只是个Demo,但希望对你快速了解Agent有所帮助!大家好,…

安装vCenter VCSA 7.0 报错 Failed to run vdcpromo 的问题

百度了一下说是DNS的问题,但我也设置了8.8.8.8或电信的dns,都不行。外网找了一下说要设置为127.0.0.1,但是7.0U3a后的版本不允许填写127.0.0.1了。最后找到一个通过CLI的方式安装可以避免这个问题。 首先创建一个CLI的横版文件,内容如下: {"__version": "2…

PostSync介绍

PostSync 促进技术文章发展介绍 这是一个开源的同步文章的软件,你可以使用它来同步你的文章到多个平台。 使用打开浏览器,登录各个平台的账号,掘金、CSDN、知乎、公众号、哔哩哔哩、博客园、个人WordPress 打开config.yaml文件,配置你的浏览器信息以及浏览器用户数据目录 运…