初學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.pswp.cn/news/903785.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903785.shtml
英文地址,請注明出處:http://en.pswp.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…