day20 最大的二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树

题目1:654 最大二叉树

题目链接:654 最大二叉树

题意

根据不重复的整数数组nums构建最大的二叉树 ,根节点是数组中的最大值,最大值左边的子数组构建左子树,最大值右边的子数组构建右子树

nums数组中最少含有1个元素,并且nums中的元素数值均大于等于0

递归 

递归三部曲:

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

2)确定终止条件

3)确定单层递归逻辑

数组

代码

/*** 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(vector<int>& nums) {//终止条件  因为递归的时候左数组可能为空,右数组可能为空if(nums.size()==0) return NULL;//单层递归逻辑//寻找中节点//找寻切割数组的位置int maxvalue = 0;int index = 0;for(int i=0;i<nums.size();i++){if(nums[i]>maxvalue){maxvalue = nums[i];index = i;}}int rootvalue = maxvalue;TreeNode* root = new TreeNode(rootvalue);//叶子节点if(nums.size()==1) return root;//切割数组 左闭右开vector<int> leftnums(nums.begin(),nums.begin()+index);vector<int> rightnums(nums.begin()+index+1,nums.end());root->left = constructMaximumBinaryTree(leftnums);root->right = constructMaximumBinaryTree(rightnums);return root;}
};
下标

代码

/*** 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* traversal(vector<int>& nums,int left,int right){//终止条件if(left>=right) return NULL;//单层递归逻辑//中节点int maxvalue = 0;int index = left;for(int i=left;i<right;i++){if(nums[i]>maxvalue){maxvalue = nums[i];index = i;}}TreeNode* root = new TreeNode(maxvalue);if(right - left == 1) return root;//左闭右开root->left = traversal(nums, left, index);//左闭右开root->right = traversal(nums, index+1, right);return root;}TreeNode* constructMaximumBinaryTree(vector<int>& nums) {return traversal(nums,0,nums.size());}
};

题目2:617 合并二叉树

题目链接:617 合并二叉树

题意

两棵树相同位置的节点视为重叠,如果两棵树的两个节点重叠,将这两个节点的值相加作为新节点的值,若不重叠,则将不是NULL的节点作为新的节点,从而合成一颗新二叉树。

同时遍历两颗树的相同位置

递归

递归三部曲:

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

2)确定终止条件

3)确定单层递归逻辑

代码(返回改变后的root1)

/*** 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* mergeTrees(TreeNode* root1, TreeNode* root2) {//终止条件if(root1==NULL) return root2;if(root2==NULL) return root1;//单层递归逻辑root1->val += root2->val;//中root1->left = mergeTrees(root1->left,root2->left);//左root1->right = mergeTrees(root1->right,root2->right);//右return root1;}
};

代码(新root)

/*** 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* mergeTrees(TreeNode* root1, TreeNode* root2) {//终止条件if(root1==NULL) return root2;if(root2==NULL) return root1;//单层递归逻辑TreeNode* root = new TreeNode(0);root->val = root1->val += root2->val;//中root->left = mergeTrees(root1->left,root2->left);//左root->right = mergeTrees(root1->right,root2->right);//右return root;}
};

层序遍历

注意开始写 遇到NULL时的return 的情况

/*** 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* mergeTrees(TreeNode* root1, TreeNode* root2) {queue<TreeNode*> que;//这里不应该这么写,可能root1==NULL root2!=NULL 这时应该返回root2// if(root1!=NULL) que.push(root1);// if(root2!=NULL) que.push(root2);if(root1==NULL) return root2;if(root2==NULL) return root1;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;}
};

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

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

题意

在二叉搜索树中找到等值于val的节点,返回以该节点为根的子树,若不存在,则返回NULL

注意:二叉搜索树是有序的(左子树的值小于中节点的值,右子树的值均大于中节点的值),遍历二叉树,如果节点值小于val,说明要去该节点的右子树寻找;如果节点值大于val,说明要去该节点的的左子树寻找,如此递归下去

递归

递归三部曲

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

2)确定终止条件

3)确定单层递归逻辑  按照二叉搜索树的特性作为顺序去遍历,不用考虑前序,中序和后序了

代码

/*** 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* searchBST(TreeNode* root, int val) {//终止条件if(root==NULL) return NULL;if(root->val==val) return root;//单层递归逻辑TreeNode* result;if(root->val>val) result = searchBST(root->left,val);if(root->val<val) result = searchBST(root->right,val);return result;}
};

迭代法(极其简单)

不用使用栈,不需要回溯过程,因为二叉搜索树的节点数值的性质帮我们确定了搜索顺序

伪代码

代码

/*** 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* searchBST(TreeNode* root, int val) {while(root!=NULL){if(root->val>val) root = root->left;else if(root->val<val) root = root->right;else return root;}return NULL;}
};

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

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

题意

判断一颗二叉树是否为有效的二叉搜索树,有效的二叉搜索树定义为:

1)节点的左子树的元素值均小于该节点

2)节点的右子树的元素值均大于该节点

3)左右节点的左右子树也为二叉搜索树

递归

递归三部曲:

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

2)确定终止条件

3)确定单层递归逻辑

数组

将二叉树中的每个元素按照中序遍历(左中右)的顺序,放入到数组中,然后判断数组是否是单调递增的即可

代码

/*** 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:vector<int> vec;void traversal(TreeNode* root){//终止条件if(root==NULL) return;//单层递归逻辑//中序遍历(左中右)traversal(root->left);vec.push_back(root->val);traversal(root->right);}bool isValidBST(TreeNode* root) {traversal(root);for(int i=0;i<vec.size();i++){if(i>=1 && vec[i]<=vec[i-1]) return false;}return true;}
};
直接判断数组是否有序(初始化最大值)

代码

/*** 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:long long maxvalue = LONG_MIN;bool isValidBST(TreeNode* root) {//终止条件if(root==NULL) return true;//单层递归逻辑//中序遍历,左中右bool left = isValidBST(root->left);//左if(maxvalue<root->val) maxvalue = root->val;//中else return false;bool right = isValidBST(root->right);//右return left && right;}
};
双指针优化(避免初始化最小值)

使用1个指针pre指向当前遍历节点的前一个节点,比较pre->val和root->val的大小

代码

/*** 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* pre = NULL;bool isValidBST(TreeNode* root) {//终止条件if(root==NULL) return true;//单层递归逻辑//中序遍历,左中右bool left = isValidBST(root->left);//左if(pre!=NULL && pre->val>=root->val) return false;//中pre = root;bool right = isValidBST(root->right);//右return left && right;}
};

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

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

相关文章

189.轮转数组(数组翻转,C解法)

题目描述&#xff1a; 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转…

怎么样的布局是符合可制造性的PCB布局?

满足可制造性、可装配性、可维修性要求&#xff0c;方便调试的时候于检测和返修&#xff0c;能够方便的拆卸器件&#xff1a; 1&#xff09;极性器件的方向不要超过2种&#xff0c;最好都进行统一方向等要求&#xff0c;如图1-1所示&#xff1b; 图1-1 极性器件方向统一摆放 2…

爬虫逆向开发教程1-介绍,入门案例

爬虫前景 在互联网的世界里&#xff0c;数据就是新时代的“黄金”。而爬虫&#xff0c;就是帮助我们淘金的“工具”。随着互联网的不断发展&#xff0c;数据量呈现指数级的增长&#xff0c;在数据为王的时代&#xff0c;有效的挖掘数据和利用&#xff0c;你会得到更多东西。 学…

UML-用例图

提示&#xff1a;用例图是软件建模的开始&#xff0c;软件建模中的其他图形都将以用例图为依据。用例图列举了系统所需要实现的所有功能&#xff0c;除了用于软件开发的需求分析阶段&#xff0c;也可用于软件的系统测试阶段。 UML-用例图 一、用例图的基础知识1.用例图的构成元…

数据结构之数组、矩阵和广义表

数据结构之数组、矩阵和广义表 1、数组1.1、数组的定义及基本运算1.2、数组的顺序存储 2、矩阵2.1、特殊矩阵2.2、稀疏矩阵 3、广义表3.1、广义表的基本操作3.2、广义表的特点3.3、广义表的存储结构 数据结构是程序设计的重要基础&#xff0c;它所讨论的内容和技术对从事软件项…

力扣:416. 分割等和子集 1049. 最后一块石头的重量 II (动态规划)(二合一,一次吃透两道题)

力扣&#xff1a;416. 分割等和子集 & 1049. 最后一块石头的重量 II 用的方法都是01背包解法&#xff0c;思路也是近乎一样&#xff0c;这里就放在一起讲解了&#xff08;主要讲解第一题&#xff0c;第二题大家可以直接自己AC&#xff09;。01背包解法详细讲解请见上篇博客…

CentOS搭建DNS服务器

服务器规划 DNS服务器IP为&#xff1a;172.16.32.253 需要自定义域名解析 172.16.32.253 dns.zhangsan.com 172.16.32.128 test1.zhangsan.com 172.16.32.129 test2.zhangsan.com 172.16.32.130 www.zhangsan.com 1. 服务器初始化 [rootlocalhost ~]# hostnamectl set-hostnam…

C++的命名空间域

一、域作用限定符 :: 即是域作用限定符&#xff0c;它的作用是指明一个标识符&#xff08;变量、函数或类&#xff09;来自哪一个作用域范围 二、编译器搜索变量、函数等的原则 1.先搜索局部变量&#xff0c;2.再搜索全局变量&#xff0c;3.最后搜索指定的命名空间域 三、…

2023.1.17 关于 Redis 持久化 AOF 策略详解

目录 引言 AOF 策略 实例演示一 缓冲区 重写机制 手动触发 自动触发 AOF 重写流程 实例演示二 引言 Redis 实现持久化的两大策略 RDB ——> Redis DataBase&#xff08;定期备份&#xff09;AOF ——> Append Only File&#xff08;实时备份&#xff09; 注意&…

15.云原生之k8s容灾与恢复实战

云原生专栏大纲 文章目录 Velero与etcd介绍Velero与etcd备份应用场景Velero与etcd在k8s备份上的区别 Velero备份恢复流程备份工作流程Velero备份时&#xff0c;若k8s集群发送变化&#xff0c;会发发生情况&#xff1f;Velero 备份pv&#xff0c;pv中数据变化&#xff0c;会发发…

开发「定位线上问题」小工具总结

文章目录 1. 写在最前面1.1 背景1.2 思路 2. 如何快速解决问题2.1 分析问题2.2 补救问题2.2.1 思路2.2.2 实现 3. 碎碎念 1. 写在最前面 1.1 背景 同事给处理各种线上问题以及处理紧急要交付的需求版本的我&#xff0c;紧急插入了一个线上的问题&#xff1a; 问题说明&#…

Java中的System类和一些练习

​​​​​​​ 目录 常用方法&#xff1a; 第一个方法&#xff1a; 第二个方法&#xff1a; 第三个方法&#xff1a; 方法 三 的拓展&#xff1a; System 和 Math 一样&#xff0c;也是一个工具类&#xff0c;提供了一些与系统相关的方法 常用方法&#xff1a; 第一个方…