初学python的我开始Leetcode题8-3

提示:100道LeetCode热题-8-3主要是二叉树相关,包括三题:将有序数组转换为二叉搜索树、验证二叉搜索树、二叉搜索树中第K小的元素。由于初学,所以我的代码部分仅供参考。


目录

前言

题目1:将有序数组转换为二叉搜索树

1.题目要求:

2.结果代码:

题目2:验证二叉搜索树

1.题目要求:

2.结果代码:

题目3:二叉搜索树中第K小的元素

1.题目要求:

2.结果代码:

总结


前言

五一快乐~

二叉搜索树奉上~


提示:以下是本篇文章正文内容,下面结果代码仅供参考

题目1:将有序数组转换为二叉搜索树

1.题目要求:

题目如下:

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。

示例 1:

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

示例 2:

输入:nums = [1,3]
输出:[3,1]
解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。

提示:

  • 1 <= nums.length <= 10^{4}
  • -10^{4} <= nums[i] <= 10^{4}
  • nums 按 严格递增 顺序排列

代码框架已经提供如下:

# Definition for a binary tree node.

# class TreeNode(object):

#     def __init__(self, val=0, left=None, right=None):

#         self.val = val

#         self.left = left

#         self.right = right

class Solution(object):

    def sortedArrayToBST(self, nums):

        """

        :type nums: List[int]

        :rtype: Optional[TreeNode]

        """

       

2.结果代码:

class Solution(object):def sortedArrayToBST(self, nums):if not nums:returnmid_index = len(nums) // 2return TreeNode(nums[mid_index], self.sortedArrayToBST(nums[:mid_index]), self.sortedArrayToBST(nums[mid_index + 1:]))

说明:

1)更快,Python 的列表切片操作在底层是高度优化的,对于小数组,切片操作的常数开销可能比递归调用的开销小。

2)小心Python 的递归深度默认为 1000。如果数组非常大,递归调用可能会导致栈溢出。。

题目2:验证二叉搜索树

1.题目要求:

题目如下:

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

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

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

示例 1:

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

示例 2:

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

提示:

  • 树中节点数目范围在[1, 10^{4}] 内
  • -2^{31} <= Node.val <= 2^{31} - 1

代码框架已经提供如下:

# Definition for a binary tree node.

# class TreeNode(object):

#     def __init__(self, val=0, left=None, right=None):

#         self.val = val

#         self.left = left

#         self.right = right

class Solution(object):

    def isValidBST(self, root):

        """

        :type root: Optional[TreeNode]

        :rtype: bool

        """

2.结果代码:

方法一:递归检查(带范围)

# Definition for a binary tree node.
class TreeNode(object):def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass Solution(object):def isValidBST(self, root):""":type root: TreeNode:rtype: bool"""def is_valid_bst_helper(node, lower=float('-inf'), upper=float('inf')):if not node:return Trueif node.val <= lower or node.val >= upper:return Falsereturn (is_valid_bst_helper(node.left, lower, node.val) andis_valid_bst_helper(node.right, node.val, upper))return is_valid_bst_helper(root)
  1. 定义了一个递归辅助函数 is_valid_bst_helper,它接收三个参数。

  2. 如果当前节点为空(nodeNone),返回 True,因为空树是有效的二叉搜索树。

  3. 如果当前节点的值小于等于下界或大于等于上界,返回 False,因为这违反了二叉搜索树的性质。

  4. 递归检查左右子树:

    • 对左子树递归调用时,更新上界为当前节点的值(node.val),因为左子树的所有值必须小于当前节点的值。

    • 对右子树递归调用时,更新下界为当前节点的值,因为右子树的所有值必须大于当前节点的值。

    • 递归检查左右子树是否都满足二叉搜索树的性质。

方法二:中序遍历

# Definition for a binary tree node.
class TreeNode(object):def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass Solution(object):def isValidBST(self, root):""":type root: TreeNode:rtype: bool"""stack = []prev_val = float('-inf')curr = rootwhile curr or stack:while curr:stack.append(curr)curr = curr.leftcurr = stack.pop()if curr.val <= prev_val:return Falseprev_val = curr.valcurr = curr.rightreturn True

  1. 使用一个栈来模拟递归的调用过程,初始化一个指针 curr 指向根节点,prev_val 用于记录上一个访问的节点值(初始为负无穷)。

  2. 遍历过程:

    • 沿着左子树一直向下,将节点压入栈中,直到左子树为空。

    • 弹出栈顶节点(即当前子树的根节点),检查其值是否大于 prev_val

    • 如果当前节点的值小于等于 prev_val,返回 False,因为这违反了二叉搜索树的性质。

    • 更新 prev_val 为当前节点的值,然后将指针移动到右子树。

题目3:二叉搜索树中第K小的元素

1.题目要求:

题目如下:

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。

示例 1:

输入:root = [3,1,4,null,2], k = 1
输出:1

示例 2:

输入:root = [5,3,6,2,4,null,null,1], k = 3
输出:3

提示:

  • 树中的节点数为 n 。
  • 1 <= k <= n <= 10^{4}
  • 0 <= Node.val <= 10^{4}

进阶:如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化算法?

代码框架已经提供如下:

# Definition for a binary tree node.

# class TreeNode(object):

#     def __init__(self, val=0, left=None, right=None):

#         self.val = val

#         self.left = left

#         self.right = right

class Solution(object):

    def kthSmallest(self, root, k):

        """

        :type root: Optional[TreeNode]

        :type k: int

        :rtype: int

        """

2.结果代码:

class Solution:def kthSmallest(self, root, k):stack = []curr = rootcount = 0while curr or stack:while curr:stack.append(curr)curr = curr.leftcurr = stack.pop()count += 1if count == k:return curr.valcurr = curr.right

说明:使用栈模拟递归过程,避免递归调用的开销。

逻辑

  1. 使用栈存储节点,模拟递归的中序遍历。

  2. 先将当前节点的所有左子节点压入栈中。

  3. 弹出栈顶节点,计数加 1,检查是否为第 k 个节点。

  4. 如果未达到第 k 个节点,继续遍历右子树。

进阶优化:如果二叉搜索树经常被修改(插入/删除操作),并且需要频繁查找第 k 小的值,可以采用以下优化方法:

  1. 存储子树大小:在每个节点中增加一个字段,记录其左子树的节点数量。这样可以在遍历时快速跳过不必要的子树。

  2. 高效查找:通过子树大小信息,直接定位到第 k 小的节点,而无需完整遍历。

这种方法的时间复杂度为 O(h),其中 h 是树的高度,对于平衡二叉搜索树,复杂度为 O(log n)。


总结

针对二叉树的三种题型进行了学习,了解了部分有关二叉树与python的相关知识,大家加油!

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

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

相关文章

1996-2022年全国31省ZF干预度数据/财政干预度数据(含原始数据+计算过程+结果)

1996-2022年全国31省ZF干预度数据/财政干预度数据&#xff08;含原始数据计算过程结果&#xff09; 1、时间&#xff1a;1996-2022年 2、来源&#xff1a;国家统计局和各省年鉴 3、指标&#xff1a;地方财政一般预算支出、地区生产总值&#xff08;GDP&#xff09;、ZF干预度…

g4f升级到0.5.2.0版本了,但是有些机器无法运行,只能降级到0.5.1.2版本

g4f升级到0.5.2.0版本了&#xff0c;跟0.5.1.2更以前的版本相比&#xff0c;主要更新为增加了可以设置Huggingface等供应商的key Providers API key HuggingFace:Get API key HuggingSpace: 因为很多模型都会调用Huggingface&#xff0c;所以最好设置Huggingface的API key。…

C语言教程(二十五):C 语言函数可变参数详解

引言: 在 C 语言编程中,有时我们需要处理参数数量不固定的情况,比如常见的 printf 函数,它可以根据格式化字符串的要求接受任意数量的参数。这种能接受不确定数量参数的函数,就是可变参数函数。下面将深入探讨其定义、实现原理、使用方式、示例以及注意事项。 一、可变参…

OpenStack Yoga版安装笔记(25)Nova Cell理解

1、Nova Cell概述 &#xff08;官方文档&#xff1a;Cells (v2) — nova 25.2.2.dev5 documentation&#xff09; Nova中的cells功能的目的是允许较大的部署将其多个计算节点分割成多个cell。所有的nova部署都默认是cell部署&#xff0c;即使大多数情况下只有单一cell。这意味…

Java Set<String>:如何高效判断是否包含指定字符串?

在 Java 开发中&#xff0c;我们经常使用 Set 集合来存储一组唯一性的元素。特别是 HashSet&#xff0c;由于其基于哈希表的实现&#xff0c;在进行元素查找&#xff08;判断是否包含&#xff09;时通常具有非常高的效率&#xff08;平均时间复杂度 O(1)&#xff09;。 那么&a…

MySQL 查找指定表名的表的主键

原理 SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME 表名 AND CONSTRAINT_NAME PRIMARY方法 public static String getPk(String tableName) {String sql "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TA…

Java大厂面试突击:从Spring Boot自动配置到Kafka分区策略实战解析

第一轮核心知识 面试官:请解释Spring Boot中自动配置的工作原理并演示如何自定义一个@ConfigurationProperties组件? xbhog:自动配置通过EnableAutoConfiguration注解触发,结合当前环境判断(如是否检测到MyBatis依赖)和条件注解(@ConditionalOnClass)来决定是否启用配…

开发板型号 ESP32-DevKitC-32模块型号 ESP32-WROOM-32 和主控芯片 ESP32-D0WDQ6-V3

以下是关于开发板型号 ESP32-DevKitC-32、模块型号 ESP32-WROOM-32 和主控芯片 ESP32-D0WDQ6-V3 的详细介绍&#xff1a; 开发板型号&#xff1a;ESP32-DevKitC-32 概述&#xff1a;ESP32-DevKitC 是乐鑫推出的一款基于 ESP32 模组的小型开发板&#xff0c;板上模组的绝大部…

数据库系统综合应用与深度实践指南

前言 在当今数据驱动的时代&#xff0c;数据库技术已成为信息系统的核心支柱。从简单的数据存储到复杂的企业级应用&#xff0c;数据库系统支撑着现代社会的方方面面。本文作为一篇综合性的数据库科普文章&#xff0c;旨在为读者提供从基础到进阶的完整知识体系&#xff0c;涵…

vscode 的空格和 tab 设置 与 Rime 自建词库

自动保存&#xff08;多用于失去焦点时保存&#xff09; Files: Auto Save 推荐不勾 保存时格式化&#xff08;Pritter 插件的功能&#xff0c;自动使用 Pritter 的格式&#xff09; Editor: Format On Save 推荐不勾 tab 的空格数量&#xff0c;2 或 4 Editor: Tab Size 推荐…

【Python爬虫详解】第五篇:使用正则表达式提取网页数据

在前面几篇文章中&#xff0c;我们介绍了几种强大的HTML解析工具&#xff1a;BeautifulSoup、XPath和PyQuery。这些工具都是基于HTML结构来提取数据的。然而&#xff0c;有时我们需要处理的文本可能没有良好的结构&#xff0c;或者我们只关心特定格式的字符串&#xff0c;这时正…

论文报错3

idm不让用&#xff1a; powershell管理员运行&#xff1a; irm https://raw.githubusercontent.com/lstprjct/IDM-Activation-Script/main/IAS.ps1 | iex 选择1&#xff1a; 输入9&#xff1a;

数据结构-树(二叉树、红黑、B、B+等)

​树的基本定义​ 树的定义 树&#xff08;Tree&#xff09;​​ 是一种 ​​非线性数据结构​​&#xff0c;由 ​​节点&#xff08;Node&#xff09;​​ 和 ​​边&#xff08;Edge&#xff09;​​ 组成&#xff0c;满足以下条件&#xff1a; ​​有且仅有一个根节点&am…

【Android】四大组件

目录 1. Activity 2. Service 3. BroadcastReceiver 4. ContentProvider 四大组件各自承担着不同的职责&#xff0c;彼此之间协同工作&#xff0c;共同为用户提供一个流畅的APP体验。 1. Activity 负责展示用户界面&#xff0c;就像App的一个个“页面”&#xff0c;用户通…

Java 多线程进阶:线程安全、synchronized、死锁、wait/notify 全解析(含代码示例)

在 Java 并发编程中&#xff0c;“线程安全” 是核心议题之一。本文将深入讲解线程安全的实现手段、synchronized 的使用方式、可重入锁、死锁的成因与避免、wait/notify 通信机制等&#xff0c;并配合实际代码案例&#xff0c;帮助你彻底搞懂 Java 线程协作机制。 一、线程安全…

高并发场景下的MySQL生存指南

引言 在2025年全球数字经济峰会上&#xff0c;阿里云披露其核心交易系统单日处理请求量突破万亿次&#xff0c;其中MySQL集群承载了78%的OLTP业务。这标志着数据库系统已进入百万级QPS时代&#xff0c;传统优化手段面临三大挑战&#xff1a; 一、硬件与架构优化&#xff1a;构…

MCP入门

什么是mcp mcp&#xff08;model context protocol&#xff0c;模型上下文协议&#xff09; 标准化协议&#xff1a;让大模型用统一的方式来调用工具&#xff0c;是llm和工具之间的桥梁 A2A&#xff1a;Agent-to-Agent协议 mcp通信机制 提供mcp服务查询的平台 具有工具合集…

服务容错治理框架resilience4jsentinel基础应用---微服务的限流/熔断/降级解决方案

继续上一章未完成的sentinel&#xff1b; 直接实操&#xff1b; 关于测试&#xff1a;本文使用线程池线程异步执行模拟并发结合Mock框架测试 其他文章 服务容错治理框架resilience4j&sentinel基础应用---微服务的限流/熔断/降级解决方案-CSDN博客 conda管理python环境-…

深入理解 C 语言中的变量作用域与链接性:`extern`、`static` 与全局变量

深入理解 C 语言中的变量作用域与链接性&#xff1a;extern、static 与全局变量 在 C 语言中&#xff0c;变量的作用域&#xff08;Scope&#xff09;和链接性&#xff08;Linkage&#xff09;是理解程序结构和模块化的关键概念。本文将详细探讨在函数外定义的变量是否为全局变…

实验三 软件黑盒测试

实验三 软件黑盒测试使用测试界的一个古老例子---三角形问题来进行等价类划分。输入三个整数a、b和c分别作为三角形的三条边&#xff0c;通过程序判断由这三条边构成的三角形类型是等边三角形、等腰三角形、一般三角形或非三角形(不能构成一个三角形)。其中要求输入变量&#x…