二叉树练习day.6

654.最大二叉树

链接:. - 力扣(LeetCode)

题目描述:

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

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

返回 nums 构建的 最大二叉树

示例 1:

输入: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:

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

提示:

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

思路:

使用前序遍历的方式创建,先在数组中找到根节点的位置和值,定义一个节点用来存储根节点的信息,根据根节点来对数组进行分割

使用递归进行实现:

1.先确定函数的参数和返回值,函数应该返回创建的节点,参数应该是数组,已经左右子树的区间范围

2.确定函数的终止条件,当遍历到叶子节点,即数组的长度为1,则赋值之后就该返回

3.确定单层递归逻辑,需要想先找到根节点的值和位置,分割数组创造左右子树

代码实现:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
struct TreeNode *create(int *nums, int lindex, int rindex)
{//左子树的范围在数组中比右子树大if (lindex >= rindex)return NULL;//找出根节点的位置int max_val = nums[lindex]; // 将 max_val 初始化为第一个元素的值int max_val_index = lindex;for(int i = lindex + 1 ; i < rindex; i++){if(nums[i] > max_val){max_val = nums[i];max_val_index = i;}}struct TreeNode *node = (struct TreeNode *)malloc(sizeof(struct TreeNode));node->val = max_val;node->left = create(nums, lindex , max_val_index);node->right = create(nums, max_val_index + 1 ,rindex);return node;
}struct TreeNode* constructMaximumBinaryTree(int* nums, int numsSize) {return create(nums, 0 , numsSize);   
}

注意:max_val初始化应该为数组的第一个元素,不能初始化为0,否则会导致根节点的判断出错

617.合并二叉树

链接:. - 力扣(LeetCode)

题目描述:

给你两棵二叉树: root1root2

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

返回合并后的二叉树。

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

示例 1:

输入: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

思路:

使用递归函数来进行解决,因为要合并两颗二叉树,因此我们需要同时遍历两颗二叉树,并且不开劈新的内存空间,而是将两个合并后的结果放在其中一颗树里

1.确定函数的参数和返回值:因为同时遍历两颗二叉树,因此参数应该传入两个二叉树的根节点

2.确定递归的终止条件:当其中一颗二叉树为空,则返回另外一颗二叉树

3.确定单层递归逻辑:将两颗二叉树合并到一颗树上,使用前中后序遍历都可以

代码实现:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
struct TreeNode* mergeTrees(struct TreeNode* root1, struct TreeNode* root2) {if(!root1 && root2)return root2;else if(root1 && !root2)return root1;else if(!root1 && !root2)return NULL;root1->val += root2->val;                           //中root1->left = mergeTrees(root1->left,root2->left); //左root1->right = mergeTrees(root1->right,root2->right); //右return root1;
}

700.二叉搜索树中的搜索

链接:. - 力扣(LeetCode)

题目描述:

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

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

示例 1:

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

示例 2:

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

提示:

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

关于二叉搜索树

1.对于BST中的每个节点,其左子树中的所有节点的值都小于该节点的值,而其右子树中的所有节点的值都大于该节点的值。这个性质保证了BST的有序性,使得对其进行搜索、插入和删除等操作更加高效

2.BST中不存在两个相同值的节点。每个节点的值都是唯一的

3.BST的左子树和右子树也分别是BST

4.对BST进行中序遍历,可以得到一个递增的有序序列

递归思路:

根据二叉搜索树的性质,可以有规律的去查找,使用递归函数来实现

1.确定函数的参数和返回值,参数应该要传入二叉搜索树的根节点和要查找的值,因为要返回值相等的子树,因此返回值也是一个节点

2.确定递归终止条件,当我们查找到相同的值,或者当节点为空时,我们就返回这个节点

3.确定单层递归逻辑,当该节点的值小于我们要查找的值,我们就去其右子树查找,当该节点的值大于我们要去查找的值,我们就去其左子树查找,如果没有找到,则返回空

提示:

果需要搜索整颗二叉树,那么递归函数就不要返回值,如果要搜索其中一条符合条件的路径,递归函数就需要返回值,因为遇到符合条件的路径了就要及时返回

代码实现:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
struct TreeNode* searchBST(struct TreeNode* root, int val) {if(root == NULL || root->val == val)return root;if(root->val > val)return searchBST(root->left, val);if(root->val < val)return searchBST(root->right, val);return NULL;
}

迭代法实现:

与递归的思路一样,根据二叉搜索树的性质来查找

代码实现:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
struct TreeNode* searchBST(struct TreeNode* root, int val) {while(root != NULL){if(root->val > val)root = root->left;else if(root->val < val)root = root->right;else if(root->val == val)return root;}return NULL;
}

98.验证二叉搜索树

链接:. - 力扣(LeetCode)

题目描述:

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

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

  • 节点的左

    子树

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

示例 1:

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

示例 2:

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

提示:

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

思路:

根据二叉搜索树的性质可知,其左子树中的所有节点的值都小于该节点的值,而其右子树中的所有节点的值都大于该节点的值,对BST进行中序遍历,可以得到一个递增的有序序列

因此,我们使用中序遍历的思想来进行解决,将所有的节点元素都存入数组中,最后判断我们的数组是否是递增的即可

递归实现:

1.确定函数的参数和返回值,因为要将二叉树节点都存入数组,因此传入的参数应该为二叉树的根节点,要存入的数组,注意还需要一个计数器,计算节点个数,不需要返回值

2.确定函数的终止条件,当二叉树为空,则退出

3.确定单层的递归逻辑,使用中序遍历,将二叉树的节点都存入数组中

代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
//中序遍历存入数组
void fc(struct TreeNode *root, int *nums, int *cout)
{if(!root)return;fc(root->left, nums,cout);nums[(*cout)++] = root->val;fc(root->right, nums,cout);
}bool isValidBST(struct TreeNode* root) {int *nums = (int *)malloc(sizeof(int)*10000);int cout = 0;fc(root,nums, &cout);for(int i = 0; i < cout-1; i++){if(nums[i] >= nums[i+1])return false;}return true;
}

易错点:

不能进行这样简单的判断,这样判断的至少当前节点的顺序,而我们要保证的是整个左子树小于根节点小于整个右子树

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

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

相关文章

C盘突然爆满,并且清理空间后,马上又会爆满

C盘突然爆满&#xff0c;并且清理空间后&#xff0c;马上又会爆满 原因解决 原因 idea本地在跑数据打印日志&#xff0c;导致产生了一个名为idea_test_1.out的文件&#xff0c;这个文件在持续增大 解决 手动删除idea_test_1.out&#xff0c;或者等任务跑完也会自动删除&…

MySQL——全文检索

不是所有的数据表都支持全文检索 MySQL支持多种底层数据库引擎&#xff0c;但是并非所有的引擎支持全文检索 &#xff0c;目前最常用引擎是是MyISAM和InnoDB&#xff1b;前者支持全文检索&#xff0c;后者不支持。 booolean模式操作符 实验&#xff1a; 表productnotes &…

大学 Python 程序设计实验报告基于自定义函数的程序设计

目录&#xff1a; 一、实验目的二、实验要求三、实验内容与程序代码 一、实验目的 掌握自定义函数的定义和使用&#xff0c;掌握递归函数和匿名函数的设计和使用、掌握常用标准库和第三方库的使用。 二、实验要求 函数的定义、调用&#xff0c;函数的参数调用。递归函数的设…

Testng测试框架(5)--依赖

有时候&#xff0c;你需要按照特定的顺序调用测试方法。这里有几个例子&#xff1a; 在运行更多测试方法之前&#xff0c;确保一定数量的测试方法已经完成且成功。 在初始化你的测试时&#xff0c;同时希望这些初始化方法也是测试方法&#xff08;用Before/After标记的方法不…

测试用例的编写方式

学习目标 能对穷举场景设计测试点能对限定边界规则设计测试点能对多条件依赖关系进行设计测试点能对于项目业务进行设计测试点 目录 等价类划分法案例 等价类划分 说明&#xff1a;在所有测试数据中&#xff0c;具有某种共同特征的数据集合进行划分分类&#xff1a; 有效等…

线程池参数如何设置

线程池参数设置 hello丫&#xff0c;各位小伙伴们&#xff0c;好久不见了&#xff01; 下面&#xff0c;我们先来复习一下线程池的参数 1、线程池参数有哪些&#xff1f; corePoolSize&#xff08;核心线程数&#xff09;&#xff1a;线程池中的常驻核心线程数。即使这些线程…

Java与Kotlin语言的特色之处

一、Java特色之处&#xff1a; 1.多异常捕获 一个try块可能捕获到多个异常&#xff0c;可以使用多个catch块分别处理每个异常&#xff0c;也可以使用一个catch块处理多个异常&#xff08;多个异常使用管道符|分隔&#xff09;。 多个catch块代码&#xff1a; try{ }catch(IOExc…

rancher踩坑日志-删除rancher接入后创建namespace失败(还继续走rancher的逻辑)

创建新的命名空间报错 [haimaKS-STAG-NODE01 ~]$ kubectl create namespace test01 Error from server (InternalError): Internal error occurred: failed calling webhook "rancher.cattle.io.namespaces.create-non-kubesystem": Post "https://rancher-web…

拥抱Linux,拥抱开源,拥抱未来

拥抱Linux,拥抱开源,拥抱未来 在这一系列的Linux专栏博客中,我们从入门到进阶,从技能到生态,再到未来展望,全方位地探讨了Linux的方方面面。Linux已经成为了我们数字生活中不可或缺的一部分,它正在深刻地影响和改变着我们的世界。 1. Linux:技术的力量 Linux不仅仅是一个操作…

FMEA与各设计工具之间有哪些联系——SunFMEA软件

在设计领域&#xff0c;FMEA与其他设计工具之间存在着紧密的关系&#xff0c;这些工具共同支持设计师在产品开发的各个阶段做出明智的决策&#xff0c;今天SunFMEA软件和大家一起了解FMEA与各设计工具之间的联系。 首先&#xff0c;FMEA与CAD&#xff08;计算机辅助设计&#…

搭建PyTorch神经网络进行气温预测(手写+调包两种方法)(保证学会!)+找到神经网络的最优情况

代码上有注释&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 本篇主要包括三大部分&#xff1a; 第一部分&#xff1a;导入数据集导入第三方库数据集简单介绍与可视化数据集简单预处理 第二部分&#xff1a;手写神经网络代码实现气温预测&#…

论文学习D2UNet:用于地震图像超分辨率重建的双解码器U-Net

标题&#xff1a;&#xff1a;Dual Decoder U-Net for Seismic Image Super-Resolution Reconstruction ——D2UNet&#xff1a;用于地震图像超分辨率重建的双解码器U-Net 期刊&#xff1a;IEEE Transactions on Geoscience and Remote Sensing 摘要&#xff1a;从U-Net派生…

linux中rpm包与deb包的区别及使用

文章目录 1. rpm与deb的区别2. deb软件包的格式和使用2.1 deb软件包命令遵行如下约定2.2 dpkg命令2.3 apt-命令 3. Unix和Linux的区别Reference 1. rpm与deb的区别 有的系统只支持使用rpm包安装&#xff0c;有的只支持deb包安装&#xff0c;混乱安装会导致系统问题。 关于rpm和…

手拉手安装启动Kafka2.13

启动Kafka本地环境需Java 8以上 Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。 这种动作&#xff08;网页浏览&#xff0c;搜索和其他用户的行动&#xff09;是在现代网络上的许多社会功能的一个关键因素。 Kafka启动…

【ubuntu20.04】安装GeographicLib

下载地址 GeographicLib: Installing GeographicLib 我们是ubuntu20.04 &#xff0c;所以下载第一个 GeographicLib-2.3.tar.gz 接着跟着官方步骤安装&#xff0c;会出错&#xff01;&#xff01;&#xff01;&#xff01;马的 官方错误示例&#xff1a;tar xfpz Geographi…

无重复字符串的最长子串

题目描述&#xff1a;给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串的长度。 第一次提交记录 class Solution:def lengthOfLongestSubstring(self, s: str) -> int:if not s:return 0lookup set()left res 0for right in range(len(s)):while s…

面试流程梳理

关于面试 经过组织者精心设计的 以交谈和观察为主要手段 评价知识&#xff0c;能力和经验&#xff0c;综合素质 HR如何拿到简历? 员工内推 猎头推荐 HR收集&#xff08;主动搜索&#xff0c;接收邮件&#xff09; 面试的环节和流程 一面&#xff08;基础知识为主&#xff0…

【Windows】如何在Windows系统上用Sudo

【背景】 研究本地化部署AI时&#xff0c;环境安装需要用sudo形式&#xff0c;考虑如何在Windows下能够使用Sudo命令。 【分析】 要使用sudo&#xff0c;就需要在windows环境下安装linux子系统。 【解决方法】 BIOS开启Intel虚拟化技术&#xff0c;在CPU选项中。我的是联想…

基于Springboot的箱包存储系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的箱包存储系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

MyBatis 模糊查询 like 语句写法

第 1 种&#xff1a;在 Java 代码中添加 sql 通配符。 string wildcardname “%smi%”; list<name> names mapper.selectlike(wildcardname);<select id”selectlike”>select * from foo where bar like #{value} </select>第 2 种&#xff1a;在 sql 语…