代碼隨想錄第15天:(二叉樹)

一、二叉搜索樹的最小絕對差(Leetcode 530)

思路1 :中序遍歷將二叉樹轉化為有序數組,然后暴力求解。

class Solution:def __init__(self):# 初始化一個空的列表,用于保存樹的節點值self.vec = []def traversal(self, root):# 遞歸函數進行中序遍歷,填充self.vec列表if root is None:return  # 如果當前節點為空,直接返回# 先遞歸遍歷左子樹self.traversal(root.left)# 將當前節點的值添加到vec列表中self.vec.append(root.val)# 然后遞歸遍歷右子樹self.traversal(root.right)def getMinimumDifference(self, root):# 清空self.vec,確保每次調用時都能重新計算最小差值self.vec = []# 中序遍歷樹,將節點值按升序存入self.vecself.traversal(root)# 如果樹中少于兩個節點,則沒有有效的差值可計算,返回0if len(self.vec) < 2:return 0# 初始化最小差值為正無窮大,用于后續的最小差值比較result = float('inf')# 遍歷self.vec,計算相鄰節點值之間的差值for i in range(1, len(self.vec)):# 計算相鄰節點之間的差值,并更新最小差值result = min(result, self.vec[i] - self.vec[i - 1])# 返回最小差值return result

思路2:雙指針直接操作二叉樹,求任意不同節點值的最小差。

class Solution:def __init__(self):# 初始化最小差值為正無窮,表示尚未計算差值self.result = float('inf')# 初始化pre為None,用來記錄上一個訪問的節點self.pre = Nonedef traversal(self, cur):# 如果當前節點為空,直接返回if cur is None:return# 遞歸遍歷左子樹self.traversal(cur.left)# 計算當前節點與上一個節點的差值if self.pre is not None:  # 如果pre不為空,說明當前節點不是最左邊的節點# 更新最小差值,計算當前節點與前一個節點的差值,并更新result為更小的值self.result = min(self.result, cur.val - self.pre.val)# 記錄當前節點,作為下一個節點的前一個節點self.pre = cur# 遞歸遍歷右子樹self.traversal(cur.right)def getMinimumDifference(self, root):# 調用traversal進行中序遍歷self.traversal(root)# 返回計算得到的最小差值return self.result

二、二叉搜索樹中的眾數(Leetcode 501)

思路1:利用字典

from collections import defaultdict# 定義二叉樹節點類 TreeNode
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = rightclass Solution:# 在BST中搜索并統計每個節點的值的頻率def searchBST(self, cur, freq_map):if cur is None:return# 統計當前節點值的頻率freq_map[cur.val] += 1# 遞歸遍歷左子樹self.searchBST(cur.left, freq_map)# 遞歸遍歷右子樹self.searchBST(cur.right, freq_map)# 找出二叉搜索樹中的出現頻率最高的值def findMode(self, root):# 初始化一個字典來記錄每個元素的頻率,使用defaultdict方便處理未出現的鍵freq_map = defaultdict(int)result = []# 如果根節點為空,返回空列表if root is None:return result# 調用遞歸方法遍歷二叉樹并統計頻率self.searchBST(root, freq_map)# 獲取頻率的最大值max_freq = max(freq_map.values())# 找出所有出現頻率等于最大值的元素for key, freq in freq_map.items():if freq == max_freq:result.append(key)# 返回頻率最高的值return result

思路二:利用二叉樹性質

class Solution:def __init__(self):self.maxCount = 0  # 最大頻率self.count = 0  # 當前頻率self.pre = None  # 前一個節點self.result = []  # 存儲眾數# 用中序遍歷BST,并統計節點值的頻率def searchBST(self, cur):if cur is None:return# 遞歸遍歷左子樹self.searchBST(cur.left)  # 左# 中if self.pre is None:  # 第一個節點,初始化頻率為1self.count = 1elif self.pre.val == cur.val:  # 當前節點與前一個節點值相同,增加頻率self.count += 1else:  # 當前節點與前一個節點值不同,重新計數為1self.count = 1# 更新前一個節點為當前節點self.pre = cur  # 更新前一個節點# 如果當前節點的頻率等于最大頻率,將該節點值添加到結果列表if self.count == self.maxCount:  self.result.append(cur.val)# 如果當前節點的頻率大于最大頻率,更新最大頻率,并清空結果列表,將當前節點值加入if self.count > self.maxCount:  self.maxCount = self.count  # 更新最大頻率self.result = [cur.val]  # 清空結果列表并將當前節點值加入# 遞歸遍歷右子樹self.searchBST(cur.right)  # 右returndef findMode(self, root):self.count = 0  # 重置頻率self.maxCount = 0  # 重置最大頻率self.pre = None  # 重置前一個節點self.result = []  # 清空結果列表self.searchBST(root)  # 調用searchBST進行遍歷并統計return self.result  # 返回眾數

三、二叉樹的最近公共祖先(Leetcode 236)

class Solution:# 定義一個函數來尋找最近公共祖先def lowestCommonAncestor(self, root, p, q):# 基本的終止條件# 1. 如果當前節點是 p 或 q,返回當前節點。# 2. 如果當前節點是 None,說明這條路徑不包含 p 或 q,返回 None。if root == q or root == p or root is None:return root# 遞歸遍歷左子樹,找到 p 和 q 中其中一個的最近公共祖先left = self.lowestCommonAncestor(root.left, p, q)# 遞歸遍歷右子樹,找到 p 和 q 中其中一個的最近公共祖先right = self.lowestCommonAncestor(root.right, p, q)# 如果左子樹和右子樹分別都找到了 p 或 q,說明當前節點是最近公共祖先# 因為 p 和 q 分別位于左右子樹if left is not None and right is not None:return root# 如果左子樹找到了 p 或 q,右子樹為 None,說明公共祖先在左子樹if left is None and right is not None:return right# 如果右子樹找到了 p 或 q,左子樹為 None,說明公共祖先在右子樹elif left is not None and right is None:return left# 如果左右子樹都為 None,說明當前節點不是公共祖先,返回 Noneelse:return None

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76515.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76515.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76515.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機操作系統-【死鎖】

文章目錄 一、什么是死鎖&#xff1f;死鎖產生的原因&#xff1f;死鎖產生的必要條件&#xff1f;互斥條件請求并保持不可剝奪環路等待 二、處理死鎖的基本方法死鎖的預防摒棄請求和保持條件摒棄不可剝奪條件摒棄環路等待條件 死鎖的避免銀行家算法案例 提示&#xff1a;以下是…

vue拓撲圖組件

vue拓撲圖組件 介紹技術棧功能特性快速開始安裝依賴開發調試構建部署 使用示例演示截圖組件源碼 介紹 一個基于 Vue3 的拓撲圖組件&#xff0c;具有以下特點&#xff1a; 1.基于 vue-flow 實現&#xff0c;提供流暢的拓撲圖展示體驗 2.支持傳入 JSON 對象自動生成拓撲結構 3.自…

go 通過匯編分析函數傳參與返回值機制

文章目錄 概要一、前置知識二、匯編分析2.1、示例2.2、匯編2.2.1、 寄存器傳值的匯編2.2.2、 棧內存傳值的匯編 三、拓展3.1 了解go中的Duff’s Device3.2 go tool compile3.2 call 0x46dc70 & call 0x46dfda 概要 在上一篇文章中&#xff0c;我們研究了go函數調用時的棧布…

python-1. 找單獨的數

問題描述 在一個班級中&#xff0c;每位同學都拿到了一張卡片&#xff0c;上面有一個整數。有趣的是&#xff0c;除了一個數字之外&#xff0c;所有的數字都恰好出現了兩次。現在需要你幫助班長小C快速找到那個拿了獨特數字卡片的同學手上的數字是什么。 要求&#xff1a; 設…

算法學習C++需注意的基本知識

文章目錄 01_算法中C需注意的基本知識cmath頭文件一些計算符ASCII碼表數據類型長度運算符cout固定輸出格式浮點數的比較max排序自定義類型字符的大小寫轉換與判斷判斷字符是數字還是字母 02_數據結構需要注意的內容1.stringgetline函數的使用string::findsubstr截取字符串strin…

從零開始寫android 的智能指針

Android中定義了兩種智能指針類型&#xff0c;一種是強指針sp&#xff08;strong pointer&#xff09;&#xff0c;源碼中的位置在system/core/include/utils/StrongPointer.h。另外一種是弱指針&#xff08;weak pointer&#xff09;。其實稱之為強引用和弱引用更合適一些。強…

【leetcode hot 100 152】乘積最大子數組

錯誤解法&#xff1a;db[i]表示以i結尾的最大的非空連續&#xff0c;動態規劃&#xff1a;dp[i] Math.max(nums[i], nums[i] * dp[i - 1]); class Solution {public int maxProduct(int[] nums) {int n nums.length;int[] dp new int[n]; // db[i]表示以i結尾的最大的非空連…

圖論整理復習

回溯&#xff1a; 模板&#xff1a; void backtracking(參數) {if (終止條件) {存放結果;return;}for (選擇&#xff1a;本層集合中元素&#xff08;樹中節點孩子的數量就是集合的大小&#xff09;) {處理節點;backtracking(路徑&#xff0c;選擇列表); // 遞歸回溯&#xff…

uniapp離線打包提示未添加videoplayer模塊

uniapp中使用到video標簽&#xff0c;但是離線打包放到安卓工程中&#xff0c;運行到真機中時提示如下&#xff1a; 解決方案&#xff1a; 1、把media-release.aar、weex_videoplayer-release.aar放到工程的libs目錄下; 文檔&#xff1a;https://nativesupport.dcloud.net.cn/…

打包構建替換App名稱

方案適用背景 一套代碼出多個安裝包&#xff0c;且安裝包的應用名稱、圖標都不一樣考慮三語名稱問題 通過 Gradle 腳本實現 gradle.properties 里面定義標識來區分應用&#xff0c;如下文里的 APP_TYPEAAA 、APP_TYPEBBB// 定義 groovy 替換方法 def replaceAppName(String …

DrissionPage移動端自動化:從H5到原生App的跨界測試

一、移動端自動化測試的挑戰與機遇 移動端測試面臨多維度挑戰&#xff1a; 設備碎片化&#xff1a;Android/iOS版本、屏幕分辨率差異 混合應用架構&#xff1a;H5頁面與原生組件的深度耦合 交互復雜性&#xff1a;多點觸控、手勢操作、傳感器模擬 性能監控&#xff1a;內存…

達夢數據庫用函數實現身份證合法校驗

達夢數據庫用函數實現身份證合法校驗 拿走不謝~ CREATE OR REPLACE FUNCTION CHECK_IDCARD(A_SFZ IN VARCHAR2) RETURN VARCHAR2 IS TYPE WEIGHT_TAB IS VARRAY(17) OF NUMBER; TYPE CHECK_TAB IS VARRAY(11) OF CHAR; WEIGHT_FACTOR WEIGHT_TAB : WEIGHT_TAB(7,9,10,5,8,4,…

3dmax的python通過普通的攝像頭動捕表情

1、安裝python 進入cdm&#xff0c;打python要能顯示版本號 >>>&#xff08;進入python提示符模式&#xff09; import sys sys.path顯示python的安裝路徑&#xff0c; 進入到python.exe的路徑 在python目錄中安裝(ctrlz退出python交互模式) 2、pip install mediapipe…

國產Linux統信安裝mysql8教程步驟

系統環境 uname -a Linux FlencherHU-PC 6.12.9-amd64-desktop-rolling #23.01.01.18 SMP PREEMPT_DYNAMIC Fri Jan 10 18:29:31 CST 2025 x86_64 GNU/Linux下載離線安裝包 瀏覽器下載https://downloads.mysql.com/archives/get/p/23/file/mysql-test-8.0.33-linux-glibc2.28…

Vite 權限繞過導致任意文件讀取(CVE-2025-32395)(附腳本)

免責申明: 本文所描述的漏洞及其復現步驟僅供網絡安全研究與教育目的使用。任何人不得將本文提供的信息用于非法目的或未經授權的系統測試。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權,請及時與我們聯系,我們將盡快處理并刪除相關內容。 前言…

poi-tl

官網地址 Poi-tl Documentationword模板引擎https://deepoove.com/poi-tl github 地址 https://github.com/Sayi/poi-tl/tree/master gitcode 加速地址 GitCode - 全球開發者的開源社區,開源代碼托管平臺GitCode是面向全球開發者的開源社區,包括原創博客,開源代碼托管,代碼…

操作系統 4.1-I/O與顯示器

外設工作起來 操作系統讓外設工作的基本原理和過程&#xff0c;具體來說&#xff0c;它概括了以下幾個關鍵步驟&#xff1a; 發出指令&#xff1a;操作系統通過向控制器中的寄存器發送指令來啟動外設的工作。這些指令通常是通過I/O指令&#xff08;如out指令&#xff09;來實現…

琥珀掃描 2.0.5.0 | 文檔處理全能助手,支持掃描、文字提取及表格識別

琥珀掃描是一款功能強大的文檔處理應用程序。它不僅僅支持基本的文檔掃描功能&#xff0c;還涵蓋了文字提取、證件掃描、表格識別等多種實用功能。無論是學生、職員還是教師&#xff0c;都能從中找到適合自己的功能。該應用支持拍照生成電子件&#xff0c;并能自動矯正文檔邊緣…

jQuery UI 小部件方法調用詳解

jQuery UI 小部件方法調用詳解 引言 jQuery UI 是一個基于 jQuery 的用戶界面和交互庫,它提供了一系列小部件,如按鈕、對話框、進度條等,這些小部件極大地豐富了網頁的交互性和用戶體驗。本文將詳細介紹 jQuery UI 中小部件的方法調用,幫助開發者更好地理解和應用這些小部…

浮點數比較在Eigen數學庫中的處理方法

浮點數比較在Eigen數學庫中的處理方法 在Eigen數學庫中進行浮點數比較時&#xff0c;由于浮點數的精度問題&#xff0c;直接使用運算符通常不是推薦的做法。Eigen提供了幾種更安全的方法來進行浮點數比較&#xff1a; 1. 近似相等比較 使用isApprox()函數進行近似比較&#…