Day22:Leetcode:654.最大二叉树 + 617.合并二叉树 + 700.二叉搜索树中的搜索 + 98.验证二叉搜索树

LeetCode:654.最大二叉树

1.思路

解决方案:

  • 单调栈是本题的最优解,这里将单调栈题解本题的一个小视频放在这里
    单调栈求解最大二叉树的过程
  • 当然这里还有leetcode大佬给的解释,大家可以参考一下:
    思路很清晰,写得很棒
    在这里插入图片描述

三句话描述单调栈的思路:

  1. 当栈顶元素小于当前元素时,不断弹出栈顶元素,并把当前元素的左子赋值为栈顶元素;
  2. 如果栈顶还有元素(那么一定比当前元素大),就把顶元素的右子赋值为当前元素;
  3. 当前元素入栈;
  • . 注意,这里的“左子赋值”指的是:将该节点以左节点的身份赋值给某某节点(如栈顶节点)
  • . 注意,这里的“右子赋值”指的是:将该节点以右节点的身份赋值给某某节点(如数组的当前元素)
  • . “当前元素”指的是,数组遍历的元素nums[i]

2.代码实现

class Solution {public TreeNode constructMaximumBinaryTree(int[] nums) {int n = nums.length;List<Integer> stack = new ArrayList<Integer>();TreeNode[] tree = new TreeNode[n];for (int i = 0; i < n; ++i) {tree[i] = new TreeNode(nums[i]);while (!stack.isEmpty() && nums[i] > nums[stack.get(stack.size() - 1)]) {tree[i].left = tree[stack.get(stack.size() - 1)];stack.remove(stack.size() - 1);}if (!stack.isEmpty()) {tree[stack.get(stack.size() - 1)].right = tree[i];}stack.add(i);}return tree[stack.get(0)];}
}

3.复杂度分析

在这里插入图片描述

3.举例分析,这里参考爪哇缪斯

在这里插入图片描述

LeetCode:617.合并二叉树

解决方案:

1.思路:

  • 可以使用递归深度优先搜索合并两个二叉树。从根节点开始同时遍历两个二叉树,并将对应的节点进行合并。

  • 两个二叉树的对应节点可能存在以下三种情况,对于每种情况使用不同的合并方式。

  • 如果两个二叉树的对应节点都为空,则合并后的二叉树的对应节点也为空;

  • 如果两个二叉树的对应节点只有一个为空,则合并后的二叉树的对应节点为其中的非空节点;

  • 如果两个二叉树的对应节点都不为空,则合并后的二叉树的对应节点的值为两个二叉树的对应节点的值之和,此时需要显性合并两个节点。

2.代码实现

class Solution {public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {if (t1 == null) {return t2;}if (t2 == null) {return t1;}TreeNode merged = new TreeNode(t1.val + t2.val);merged.left = mergeTrees(t1.left, t2.left);merged.right = mergeTrees(t1.right, t2.right);return merged;}
}

3.复杂度分析

在这里插入图片描述

LeetCode:700.二叉搜索树中的搜索

解决方案:

1.思路:

2.代码实现


class Solution {public TreeNode searchBST(TreeNode root, int val) {if (root == null) {return null;}if (val == root.val) {return root;}return searchBST(val < root.val ? root.left : root.right, val);}
}

3.复杂度分析

在这里插入图片描述

4.疑惑思考

为什么递归实现,c++和java的逻辑不一样

  • C++实现:
public:TreeNode* searchBST(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;      //为什么一定要加这句,前面分情况讨论时不是已经有return了吗?}
};
  • java实现
class Solution {public TreeNode searchBST(TreeNode root, int val) {if (root == null) {return null;}if (val == root.val) {return root;}return searchBST(val < root.val ? root.left : root.right, val);}
}

LeetCode:98.验证二叉搜索树

问题描述

解决方案:

1.思路:

  • 如果该二叉树的左子树不为空,则左子树上所有节点的值均小于它的根节点的值;
  • 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
  • 它的左右子树也为二叉搜索树。
  • 以 root 为根的子树,判断子树中所有节点的值是否都在 (l,r)(l,r)(l,r) 的范围内(注意是开区间)。
  • 如果 root 节点的值 val 不在 (l,r)(l,r)(l,r) 的范围内说明不满足条件直接返回,
  • 否则我们要继续递归调用检查它的左右子树是否满足,如果都满足才说明这是一棵二叉搜索树。

2.代码实现

class Solution {public boolean isValidBST(TreeNode root) {return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);}public boolean isValidBST(TreeNode node, long lower, long upper) {if (node == null) {return true;}if (node.val <= lower || node.val >= upper) {return false;}return isValidBST(node.left, lower, node.val) && isValidBST(node.right, node.val, upper);}
}

3.复杂度分析

在这里插入图片描述

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

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

相关文章

云渲染的线程数是什么意思?

云渲染线程是指在云渲染过程中&#xff0c;同时处理渲染任务的线程数量。 线程是CPU调度和执行的基本单位&#xff0c;每个线程可以独立执行一系列指令。在云渲染场景中&#xff0c;服务器通常配备有高性能的CPU&#xff0c;这些CPU可能拥有几十甚至上百个物理核心&#xff0c…

python多个list组成的list去重 考虑顺序

在Python中&#xff0c;如果你有多个列表组成的列表&#xff0c;并且你想要去除其中的重复元素&#xff0c;同时考虑顺序&#xff0c;你可以使用functools.total_ordering装饰器来简化代码&#xff0c;并使用set来去重。 下面是一个示例代码&#xff1a; from functools impo…

Vue2基础及其进阶面试(一)

简单版项目初始化 新建一个vue2 官网文档&#xff1a;介绍 — Vue.js 先确保下载了vue的脚手架 npm install -g vue-cli npm install -g vue/cli --force vue -V 创建项目 vue create 自己起个名字 选择自己选择特性 选择&#xff1a; Babel&#xff1a;他可以将我们写…

单向无头链表实现

目录 1. 为什么要有链表&#xff1f; 2. 链表的种类 3. 具体功能实现 &#xff08;1&#xff09;节点结构体定义 &#xff08;2&#xff09;申请节点 &#xff08;3&#xff09;尾插 &#xff08;4&#xff09;尾删 &#xff08;5&#xff09;头插 &#xff08;6&#…

SDUT 链表3

7-3 sdut-C语言实验-链表的结点插入 分数 20 全屏浏览 切换布局 作者 马新娟 单位 山东理工大学 给出一个只有头指针的链表和 n 次操作&#xff0c;每次操作为在链表的第 m 个元素后面插入一个新元素x。若m 大于链表的元素总数则将x放在链表的最后。 输入格式: 多组输入。…

【Python设计模式13】抽象工厂模式

抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供一个接口&#xff0c;用于创建一系列相关或依赖的对象&#xff0c;而无需指定它们具体的类。抽象工厂模式通过对产品类的抽象&#xff0c;使客户端可以使用抽象工厂来创建…

算法和远程编程题

文章目录 2024心得0504 堆/栈/队列用两个栈实现队列 05 哈希BM52 数组中只出现一次的两个数字 2024 牛客网在线编程 心得 大厂会要求&#xff0c;这个其实没有什么用&#xff0c;就是故意为难人&#xff0c;但是要想找一份工作&#xff0c;这个还是只能去遵守规则。面试造火…

go语言之函数基础

1.介绍 函数是基本的代码块&#xff0c;Go是编译型语言&#xff0c;所以函数编写的顺序是无关紧要的&#xff0c;但是我们一般把main&#xff08;&#xff09;函数写在文件的前面&#xff0c;其他函数按照一定的逻辑顺序编写&#xff08;例如函数被调用顺序&#xff09;。 编写…

PHP的多样化执行方式(parallel PHP多线程实现,原生协程实现,多进程实现,ZTS、NTS、TS又是什么)

进程、线程、协程 进程&#xff1a;应用程序的启动实例&#xff0c;运行起的代码叫进程&#xff0c;有独立的内存空间&#xff0c;类比工厂的P个&#xff08;P1单进程&#xff0c;P>1多进程&#xff09;车间。线程&#xff1a;线程是CPU调度的最小单位&#xff0c;是进程内…

面向对象-----继承

前面向大家介绍了面向对象中的封装性&#xff0c;今天再来向大家介绍面向对象的继承和多态的两大特性。 1.继承 1.1 为什么需要继承&#xff1f; 在java语言中&#xff0c;我们用类来描述世间万物&#xff0c;虽然万物非常复杂&#xff0c;但总有一些共同点&#xff0c;如果…

CAD2023 2024 2025以上版本出现无法运行 AutoCAD,原因可能如下1) 此版本的 AutoCAD 安装不正确

错误提示如下 此版本的 AutoCAD 安装不正确 缺少依赖组件Microsoft Edge webview2 Runtime 缺少依赖组件 Microsoft.NET跟You must install .NET Desktop Runtime 打开autoremove&#xff0c;点击扩展&#xff0c;输入 无法运行&#xff0c;点击搜索 你的软件属于什么版本…

fork 与 vfork 的区别

关键区别一&#xff1a; vfork 直接使用父进程存储空间&#xff0c;不拷贝。 关键区别二&#xff1a; vfork保证子进程先运行,当子进程调用exit退出后&#xff0c;父进程才执行。 我们可以定义一个cnt&#xff0c;在子进程中让它变成3&#xff0c; 如果使用fork&#xff0c;那…

PHP 7.4开始 调用方法success()可根据参数名称来指定参数值uccess(data: $list, count: $count)

定义了方法&#xff1a; static function success(int $code200,string $msgok,array $data[],int $count0,int $pages1){return [code>$code,msg>$msg,data>$data,count>$count,pages >$pages]; } 引用&#xff1a;(不用按顺序) return self::success(data:…

【LeetCode】【1】两数之和(1141字)

文章目录 [toc]题目描述样例输入输出与解释样例1样例2样例3 提示进阶Python实现哈希表 个人主页&#xff1a;丷从心 系列专栏&#xff1a;LeetCode 刷题指南&#xff1a;LeetCode刷题指南 题目描述 给定一个整数数组nums和一个整数目标值target&#xff0c;请在该数组中找出…

【Vue3进阶】- Vite 配置

视频 Vite 配置 基础配置项 server 选项 本地运行时&#xff0c;开发环境服务器的配置。 host 默认 localhost&#xff0c;设置为 true 或 0.0.0.0 时会监听所有地址&#xff0c;让局域网内的设备进行访问&#xff0c;否则只有本机能访问项目。 open 默认 false&#x…

C#如何通过反射获取外部dll的函数

在C#中&#xff0c;你可以使用反射&#xff08;Reflection&#xff09;来加载外部的DLL&#xff08;动态链接库&#xff09;并获取其中的函数&#xff08;在C#中通常称为方法&#xff09;。但是&#xff0c;请注意&#xff0c;反射主要用于访问类型信息&#xff0c;并且对于非托…

Apache 平滑升级:逐步指南与示例

在维护Web服务器时&#xff0c;Apache的平滑升级是一项重要的操作&#xff0c;它可以确保服务在升级过程中继续对外提供服务&#xff0c;最小化或无需停机时间。本文将详细介绍如何在Linux系统中平滑升级Apache HTTP服务器&#xff0c;提供一个完整的操作示例&#xff0c;并说明…

Typora+PicGo+Gitee设置图床,解决CSDN上传markdown文件图片加载不出来的问题(超级实用)

注&#xff1a; 由于gitee现在已经加上了防盗链&#xff0c;并且只支持1M的图片&#xff0c;我觉得不是很好用&#xff08;可以买腾讯云或阿里云等&#xff09;&#xff0c;之后找到比较好点的图床工具也会持续更新的。&#xff08;sm.ms好像还好&#xff0c;github网速不太稳定…

计算机网络 3.5局域网

第五节 局域网 一、认识局域网 1.定义&#xff1a; ①功能性&#xff1a;一组在地理位置上相隔不远的计算机及其设备按照一定的连接方式组织起来的&#xff0c;以实现用户间相互通信的资源共享的网络系统。 ②技术性&#xff1a;由特定类型的传输媒体和网络适配器互联在一起…