代碼隨想錄算法訓練營第十七天

目錄

LeetCode.654 最大二叉樹

題目鏈接?最大二叉樹

題解

解題思路

LeetCode.617 合并二叉樹

題目鏈接??合并二叉樹

題解

解題思路

LeetCode.700 二叉搜索樹中的搜索

題目鏈接?二叉搜索樹中的搜索

題解

解題思路

解題思路

LeetCode.98 驗證二叉搜索樹

題目鏈接?驗證二叉搜索樹

題解

解題思路

解題思路

總結與收獲


LeetCode.654 最大二叉樹

題目鏈接?最大二叉樹

題解

class Solution {public TreeNode constructMaximumBinaryTree(int[] nums) {return getRoot(nums,0,nums.length);}public TreeNode getRoot(int[] nums,int begin,int end){// 獲得最大值int max_value = nums[begin];int index = begin;for(int i = index;i < end;i ++){if(max_value < nums[i]){index = i;max_value = nums[i];}}TreeNode root = new TreeNode(max_value);if(index > begin){root.left = getRoot(nums,begin,index);}if(index < end - 1){root.right = getRoot(nums,index + 1,end);}return root;}
}

解題思路

這段代碼實現了構造最大二叉樹(Maximum Binary Tree)的功能,核心思路是遞歸分治:每次從當前數組片段中找到最大值作為根節點,再遞歸處理左右子數組構建左右子樹。具體步驟如下:

  1. 主函數入口constructMaximumBinaryTree?初始化遞歸,傳入整個數組范圍?[0, nums.length)

  2. 遞歸構建樹:輔助函數?getRoot?負責:

    • 尋找最大值:遍歷當前范圍?[begin, end),找到最大值及其索引。
    • 創建根節點:用最大值創建當前子樹的根。
    • 遞歸處理左右子樹
      • 左子樹:處理范圍?[begin, index)(即最大值左側元素)。
      • 右子樹:處理范圍?[index+1, end)(即最大值右側元素)。
    • 返回當前根節點:將左右子樹連接到根節點后返回。
  3. 遞歸終止條件:當?begin >= end?時(即處理空數組片段),返回?null

LeetCode.617 合并二叉樹

題目鏈接??合并二叉樹

題解

class Solution {public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {if(root1 == null) return root2;if(root2 == null) return root1;root1.val += root2.val;root1.left = mergeTrees(root1.left,root2.left);root1.right = mergeTrees(root1.right,root2.right);return root1;}
}

解題思路

使用前序遍歷,同時對兩個樹進行遍歷。

LeetCode.700 二叉搜索樹中的搜索

題目鏈接?二叉搜索樹中的搜索

題解

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

解題思路

這段代碼實現了在? 二叉搜索樹(BST) 中查找值為?val?的節點。解題思路基于 BST 的特性:左子樹所有節點值小于根節點,右子樹所有節點值大于根節點,因此可以通過比較當前節點值與目標值的大小,遞歸地縮小搜索范圍。

解題思路

  1. BST 特性利用

    • 若當前節點值等于?val,直接返回當前節點。
    • 若?val?小于當前節點值,只需在左子樹中繼續搜索(因為右子樹所有值都更大)。
    • 若?val?大于當前節點值,只需在右子樹中繼續搜索(因為左子樹所有值都更小)。
  2. 遞歸搜索過程

    • 終止條件:當前節點為空(未找到)或當前節點值等于?val(找到目標)。
    • 遞歸邏輯:根據當前節點值與?val?的大小關系,選擇左子樹或右子樹繼續搜索,并返回搜索結果。
  3. 代碼實現步驟

    • 檢查當前節點:若為空或值匹配,直接返回。
    • 遞歸搜索
      • 若?val < root.val,遞歸搜索左子樹。
      • 若?val > root.val,遞歸搜索右子樹。
    • 返回結果:遞歸調用的結果即為最終結果。

LeetCode.98 驗證二叉搜索樹

題目鏈接?驗證二叉搜索樹

題解

class Solution {private long prev = Long.MIN_VALUE;public boolean isValidBST(TreeNode root) {if(root == null) return true;if(!isValidBST(root.left)) return false;if(root.val <= prev) return false;prev = root.val;return isValidBST(root.right);}
}

解題思路

這段代碼通過中序遍歷(In-order Traversal)的方式驗證二叉樹是否為合法的二叉搜索樹(BST)。解題的核心思路是利用 BST 的中序遍歷結果為嚴格升序序列這一特性,通過遞歸遍歷過程中檢查每個節點的值是否嚴格大于前一個訪問的節點值。

解題思路

  1. BST 的中序遍歷特性

    • 對于合法的 BST,中序遍歷(左 → 根 → 右)的輸出必須是嚴格遞增的序列。
    • 例如,BST?[2,1,3]?的中序遍歷為?[1,2,3],嚴格遞增。
  2. 遞歸中序遍歷驗證

    • 使用全局變量?prev?記錄中序遍歷過程中前一個節點的值(初始化為?Long.MIN_VALUE)。
    • 遞歸遍歷左子樹,若左子樹不合法則直接返回?false
    • 檢查當前節點值是否大于?prev,若不大于則返回?false
    • 更新?prev?為當前節點值,遞歸遍歷右子樹。
  3. 代碼實現步驟

    • 終止條件:空樹視為合法 BST,返回?true
    • 遞歸左子樹:驗證左子樹是否合法。
    • 檢查當前節點:確保當前節點值大于?prev,并更新?prev
    • 遞歸右子樹:驗證右子樹是否合法。

總結與收獲

總結上述二叉樹相關題目解法,核心均圍繞遞歸與樹的特性展開。構造最大二叉樹用遞歸分治,以最大值為根劃分左右子樹;合并二叉樹通過前序遍歷同步處理兩樹節點;BST 搜索和驗證則依托其左小右大特性,分別用遞歸縮小范圍和中序遍歷檢查升序。這些解法體現了遞歸在樹問題中的高效應用,以及利用數據結構特性簡化邏輯的關鍵思路。

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

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

相關文章

pycharm無法識別pip安裝的包

在使用conda創建一個新的環境后&#xff0c;有些包通過pip的方式安裝更方便有效&#xff0c;若在pip安裝后&#xff0c;遇到該環境沒有此包&#xff0c;或pycharm監測不到此包&#xff0c;通常是pip的環境指向有問題。 解決措施&#xff1a; # 首先檢查當前pip的指向 which pip…

Elasticsearch 的 `modules` 目錄

Elasticsearch 的 modules 目錄是存放**核心功能模塊**的目錄&#xff0c;這些模塊是 Elasticsearch 運行所必需的基礎組件&#xff0c;**隨官方發行版一起提供**&#xff0c;但設計上允許通過移除或替換模塊來**定制化部署**&#xff08;比如構建一個最小化的 Elasticsearch 實…

https——TCP+TLS

https——TCPTLS主題&#xff1a;基于mbedtls-2.16.0&#xff0c;驗證TLS會話復用功能驗證環境&#xff1a;1.TLS服務端2.TLS客戶端2.1 基于Sesssion ID2.1.1mbedtls-2.16.0庫的宏配置2.1.2 初始化配置2.1.3 TCP連接2.1.4 首次TLS連接2.1.4.1 發送加密算法列表2.1.4.2 選擇加密…

uni-app uni-push 2.0推送圖標不展示問題

問題現象&#xff1a;我在uni-app的配置文件&#xff0c;配置了推送的大圖標小圖標發現在真機測試無法展示配置的推送圖標問題 官網文檔&#xff1a;開通 | uni-app官網 解決方法&#xff1a; 在uni-app官網中說的并不是很清楚只給了一個簡單的示例&#xff0c;配置并沒有告訴我…

scp:上傳大型數據集到實驗室服務器

我通過百度網盤下載了大概200GB的LUNA-2016的肺結節CT數據。實驗是在實驗室服務器上進行的&#xff0c;我現在需要將本地的數據集傳輸到實驗室的服務器上。我已經通過remote-ssh連接上了實驗室的服務器&#xff0c;但是如果通過這個插件上傳數據的話&#xff0c;一方面不支持上…

量子計算突破:8比特擴散模型實現指數級加速

目錄 一、量子擴散模型&#xff08;Quantum Diffusion&#xff09; 二、DNA存儲生成&#xff08;Biological-GAN&#xff09; 三、光子計算加速 四、神經形態生成 五、引力場渲染 六、分子級生成 七、星際生成網絡 八、元生成系統 極限挑戰方向 一、量子擴散模型&…

Flask3.1打造極簡CMS系統

基于Flask 3.1和Python 3.13的簡易CMS以下是一個基于Flask 3.1和Python 3.13的簡易CMS管理系統實現方案&#xff0c;包含核心功能和可運行代碼示例。環境準備安裝Flask和其他依賴庫&#xff1a;pip install flask3.1.0 flask-sqlalchemy flask-login配置數據庫在config.py中設置…

用 Node.js 構建模塊化的 CLI 腳手架工具,從 GitHub 下載遠程模板

本文將手把手帶你構建一個支持遠程模板下載、自定義項目名稱&#xff0c;并完成模塊化拆分的 CLI 腳手架工具&#xff0c;適用于初創項目、團隊內部工具或者開源項目快速初始化。&#x1f9e9; 為什么要自己造一個 CLI 腳手架&#xff1f; 在日常開發中&#xff0c;我們常用腳手…

08.如何正確關閉文件

如何正確關閉文件(File Handling Best Practices) 文件操作是日常開發中非常常見的任務,正確關閉文件對于避免資源泄漏尤為關鍵。錯誤的文件關閉方式可能導致文件未保存、鎖定或其他異常。 1. 常見的錯誤方式:手動 close() 許多初學者會手動調用 close() 關閉文件,這在異…

算法入門--動態規劃(C++)

深入淺出掌握動態規劃核心思想&#xff0c;圖文并茂實戰代碼 什么是動態規劃&#xff1f; 動態規劃&#xff08;Dynamic Programming, DP&#xff09; 是一種高效解決多階段決策問題的方法。它通過將復雜問題分解為重疊子問題&#xff0c;并存儲子問題的解&#xff08;避免重…

[2025CVPR]GNN-ViTCap:用于病理圖像分類與描述模型

論文結構解析? 本文采用經典學術論文結構: ?引言?:闡述病理圖像分析的挑戰與現有方法局限性?相關工作?:系統梳理MIL、視覺語言預訓練和生物醫學語言模型三大領域?方法?:詳細闡述GNN-ViTCap四階段架構?實驗?:在BreakHis和PatchGastric數據集驗證性能?討論?:通…

Java SE--圖書管理系統模擬實現

一.設計思路首先這個系統可以由倆種用戶使用&#xff0c;分別為管理者用戶和普通者用戶&#xff0c;根據不同的用戶有不同的界面&#xff0c;每個界面有不同的功能。二.代碼實現創建三個包和一個類book包&#xff1a;包括Book類和Booklist類Book類&#xff1a;package book; pu…

[RPA] 批量數據抓取指定商品名稱信息

影刀RPA案例&#xff1a;批量數據抓取指定商品名稱信息流程圖&#xff1a;操作步驟&#xff1a;涉及的影刀RPA大致指令&#xff1a; 1. 打開影刀商城頁面 2. 使用【填寫輸入框(web)】指令輸入用戶名和密碼&#xff0c;并點擊"登錄"按鈕 3. 切換到"訂單管理"…

我的世界Java版1.21.4的Fabric模組開發教程(十四)方塊實體

這是適用于Minecraft Java版1.21.4的Fabric模組開發系列教程專欄第十四章——方塊實體。想要閱讀其他內容&#xff0c;請查看或訂閱上面的專欄。 方塊實體(Block Entity) 指的是一種用于存儲方塊額外數據的方法。但這種數據和為了控制方塊狀態而在自定義方塊類中創建的屬性不太…

【UE教程/進階】UE中的指針與引用

目錄直接屬性引用共享指針 TSharedPtr實現原理共享引用 TSharedRef弱引用指針 TWeakPtrObject弱指針 FWeakPtr實現原理Object軟指針 FSoftObjectPtr原理直接屬性引用 在c通過UPROPERTY()宏將屬性公開&#xff0c;藍圖中屬性類型中的Object Reference。 對一個類型及其子類型的…

早期 CNN 的經典模型—卷積神經網絡(LeNet)

目錄 LeNet 的設計背景與目標 LeNet 的網絡結構&#xff08;經典 LeNet-5&#xff09; 局部感受野詳解 一、局部感受野和全連接網絡的區別 1. 傳統全連接網絡的問題 2. 局部感受野的解決方案 二、局部感受野的優勢 1. 參數大幅減少 2. 提取局部特征 3. 平移不變性 參數…

RabbitMQ 高級特性之延遲隊列

1. 簡介 在某些場景下&#xff0c;當生產者發送消息后&#xff0c;可能不需要讓消費者立即接收到&#xff0c;而是讓消息延遲一段時間后再發送給消費者。 2. 實現方式 2.1 TTL 死信隊列 給消息設置過期時間后&#xff0c;若消息在這段時間內沒有被消費&#xff0c;就會將消…

uniapp app安卓下載文件 圖片 doc xls 數據流文件 app安卓本地路徑下載保存

//下載圖片 downloadToLocal() {plus.android.requestPermissions([android.permission.WRITE_EXTERNAL_STORAGE],(success) > {uni.saveImageToPhotosAlbum({filePath: /static/x.png,//本地地址success: () > {this.$refs.uToast.show({message: "模版下載成功&am…

Context Engineering:從Prompt Engineering到上下文工程的演進

最近在做Deepresearch以及刷到一個不錯的文章&#xff1a;context-engineering-guide &#xff0c;這篇文章揭示了提示工程以及上下文過程在智能體應用開源流程中&#xff0c;包括Deepresearch&#xff0c;MCP在內的一些概念&#xff0c;起到了非常重要的作用&#xff01; Cont…

jenkins部署vue前端項目

文章目錄前言一、安裝nginx二、jenkins構建項目總結前言 前面已經使用jenkins部署了后端springboot項目&#xff0c;現在開始學習jenkins部署前端Vue項目。 一、安裝nginx 訪問nginx官網&#xff0c;https://nginx.org/en/download.html下載tar包 上傳到服務器目錄中 然后到…