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

news/2024/9/23 12:20:32/

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.cn/problems/maximum-binary-tree/solutions/1/zhua-wa-mou-si-by-muse-77-myd7/" rel="nofollow">爪哇缪斯

在这里插入图片描述

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.ppmy.cn/news/1463263.html

相关文章

Elastic Cloud 将 Elasticsearch 向量数据库优化配置文件添加到 Microsoft Azure

作者&#xff1a;来自 Elastic Serena Chou, Jeff Vestal, Yuvraj Gupta 今天&#xff0c;我们很高兴地宣布&#xff0c;我们的 Elastic Cloud Vector Search 优化硬件配置文件现已可供 Elastic Cloud on Microsoft Azure 用户使用。 此硬件配置文件针对使用 Elasticsearch 作…

【Python设计模式15】适配器模式

适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而无法一起工作的类能够一起工作。通过使用适配器模式&#xff0c;可以使得现有的类能够适应新的接口需…

Stanford-Coursera 算法Week1 笔记

题外话&#xff1a;全文免费放心食用&#xff0c;作者在此求个 三连关注 1. Integer Multiplication&#xff08;引入&#xff09; &#xff08;很小的时候我们就学过&#xff1a;两个数字相乘的算法——将输入(两个数字)转换为输出(它们的乘积)的一组定义良好的规则&#xf…

超级好用的C++实用库之环形内存池

&#x1f4a1; 需要该C实用库源码的大佬们&#xff0c;可搜索微信公众号“希望睿智”。添加关注后&#xff0c;输入消息“超级好用的C实用库”&#xff0c;即可获得源码的下载链接。 概述 环形内存池是一种高效的内存管理技术&#xff0c;特别适合于高并发、实时性要求高的系统…

RmlUi 初试,hello world

前言 最近在研究GUI的各个方面&#xff0c;最后被导向了web render&#xff0c;真的是一言难尽。 这里就其中一个比较有意思的项目 RmlUi 浅试一下&#xff0c;没想要还挺麻烦&#xff01;这里留下note以供后人参考。 环境搭建 Windows VS2022 pre-binary library 需要指…

零基础学Java(全170集)

课程概述 本课程旨在全面深化对 Java 语言的核心技术理解&#xff0c;并提升编程实践能力。课程内容涵盖以下关键领域&#xff1a; 掌握Java核心语法&#xff0c;为后续学习打下扎实的基础。熟练运用Java常用的类库与开发工具&#xff0c;提高开发效率与质量。解决面向对象编…

web4.0-元宇宙虚拟现实

互联网一直在不断演变和改变我们的生活方式&#xff0c;从Web逐渐 1.0时代的静态网页到Web 2.0时代的社会性和内容制作&#xff0c;再从Web逐渐 在3.0阶段&#xff0c;互联网发展一直推动着大家时代的发展。如今&#xff0c;大家正站在互联网演化的新起点上&#xff0c;迈入Web…

HTML+CSS+JS简易计算器

HTMLCSSJS简易计算器 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>简易计算器</t…