力扣top100(day02-05)--二叉樹 02

102. 二叉樹的層序遍歷

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {// 創建結果列表,用于存儲每層的節點值List<List<Integer>> ret = new ArrayList<List<Integer>>();// 處理空樹情況if (root == null) {return ret;}// 創建隊列用于BFS遍歷,初始時加入根節點Queue<TreeNode> queue = new LinkedList<TreeNode>();queue.offer(root);  // 將根節點加入隊列// 開始BFS遍歷while (!queue.isEmpty()) {// 創建當前層的節點值列表List<Integer> level = new ArrayList<Integer>();// 記錄當前層的節點數量int currentLevelSize = queue.size();// 遍歷當前層的所有節點for (int i = 1; i <= currentLevelSize; ++i) {// 從隊列頭部取出一個節點TreeNode node = queue.poll();// 將節點值加入當前層列表level.add(node.val);// 將該節點的子節點加入隊列(先左后右)if (node.left != null) {queue.offer(node.left);}if (node.right != null) {queue.offer(node.right);}}// 將當前層的節點值列表加入結果列表ret.add(level);}// 返回層序遍歷結果return ret;}
}

關鍵點說明

  1. BFS(廣度優先搜索)算法

    • 使用隊列數據結構實現

    • 從根節點開始,按層級依次遍歷

  2. 層序遍歷的特點

    • 每層節點單獨存儲在一個子列表中

    • 結果是一個二維列表,每個子列表代表一層的節點值

  3. 隊列的使用

    • offer()方法用于將元素加入隊列尾部

    • poll()方法用于從隊列頭部取出元素

  4. 時間復雜度

    • O(n):每個節點被訪問一次

    • n為二叉樹中的節點總數

  5. 空間復雜度

    • O(n):最壞情況下隊列需要存儲所有葉子節點

示例執行流程

對于如下二叉樹:

text

    3/ \9  20/  \15   7

執行過程:

  1. 初始隊列:[3]

    • 處理3,加入子列表[3]

    • 加入子節點9,20 → 隊列:[9,20]

  2. 處理隊列:[9,20]

    • 處理9 → 子列表[9](無子節點)

    • 處理20 → 子列表[9,20]

    • 加入子節點15,7 → 隊列:[15,7]

  3. 處理隊列:[15,7]

    • 處理15 → 子列表[15](無子節點)

    • 處理7 → 子列表[15,7](無子節點)

  4. 最終結果:[[3], [9,20], [15,7]]

108. 將有序數組轉換為二叉搜索樹

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public TreeNode sortedArrayToBST(int[] nums) {return helper(nums, 0, nums.length - 1);}public TreeNode helper(int[] nums,int left, int right){if(left>right){return null;}int tip=(left+right)/2;TreeNode root = new TreeNode(nums[tip]);root.left=helper(nums, left, tip-1);root.right=helper(nums,tip+1,right);return root;}
}

/**
?* Definition for a binary tree node.
?* public class TreeNode {
?* ? ? int val;
?* ? ? TreeNode left;
?* ? ? TreeNode right;
?* ? ? TreeNode() {}
?* ? ? TreeNode(int val) { this.val = val; }
?* ? ? TreeNode(int val, TreeNode left, TreeNode right) {
?* ? ? ? ? this.val = val;
?* ? ? ? ? this.left = left;
?* ? ? ? ? this.right = right;
?* ? ? }
?* }
?*/
class Solution {
? ? /**
? ? ?* 將有序數組轉換為高度平衡的二叉搜索樹
? ? ?* @param nums 有序整數數組
? ? ?* @return 二叉搜索樹的根節點
? ? ?*/
? ? public TreeNode sortedArrayToBST(int[] nums) {
? ? ? ? // 調用輔助函數,傳入數組和初始邊界
? ? ? ? return helper(nums, 0, nums.length - 1);
? ? }
? ??
? ? /**
? ? ?* 遞歸輔助函數,構建BST
? ? ?* @param nums 有序數組
? ? ?* @param left 當前子數組的左邊界
? ? ?* @param right 當前子數組的右邊界
? ? ?* @return 構建好的子樹根節點
? ? ?*/
? ? public TreeNode helper(int[] nums, int left, int right) {
? ? ? ? // 遞歸終止條件:左邊界超過右邊界
? ? ? ? if (left > right) {
? ? ? ? ? ? return null;
? ? ? ? }
? ? ? ??
? ? ? ? // 選擇中間位置作為當前子樹的根節點
? ? ? ? // 這樣能保證樹的高度平衡
? ? ? ? int mid = (left + right) / 2;
? ? ? ??
? ? ? ? // 創建當前根節點
? ? ? ? TreeNode root = new TreeNode(nums[mid]);
? ? ? ??
? ? ? ? // 遞歸構建左子樹(使用左半部分數組)
? ? ? ? root.left = helper(nums, left, mid - 1);
? ? ? ??
? ? ? ? // 遞歸構建右子樹(使用右半部分數組)
? ? ? ? root.right = helper(nums, mid + 1, right);
? ? ? ??
? ? ? ? return root;
? ? }
}

關鍵點說明

  1. 高度平衡BST的定義

    • 每個節點的左右子樹高度差不超過1

    • 通過總是選擇中間元素作為根節點來保證平衡性

  2. 分治算法思想

    • 將問題分解為更小的子問題(左子樹和右子樹)

    • 合并子問題的解(構建當前樹)

  3. 時間復雜度

    • O(n):每個元素只被訪問一次

    • n為數組長度

  4. 空間復雜度

    • O(log n):遞歸棧的深度

    • 對于平衡BST,樹的高度為log n

  5. 中間位置選擇

    • mid = (left + right) / 2?對于偶數長度數組,可以選擇中間偏左或偏右

    • 這里選擇的是偏左的位置(因為整數除法會截斷小數)

示例執行流程

對于輸入數組:[-10, -3, 0, 5, 9]

構建過程:

  1. 初始調用:helper(nums, 0, 4)

    • mid=2 → root=0

    • 左子樹:helper(nums, 0, 1)

      • mid=0 → root=-10

      • 左子樹:helper(nums, 0, -1) → null

      • 右子樹:helper(nums, 1, 1)

        • mid=1 → root=-3

        • 左右子樹均為null

    • 右子樹:helper(nums, 3, 4)

      • mid=3 → root=5

      • 左子樹:helper(nums, 3, 2) → null

      • 右子樹:helper(nums, 4, 4)

        • mid=4 → root=9

        • 左右子樹均為null

最終BST結構:

text

      0/ \-10  5\   \-3   9

算法變體

  1. 選擇中間偏右的位置

    java

    int mid = (left + right + 1) / 2;

    對于偶數長度數組會選擇中間偏右的元素

  2. 迭代實現
    可以使用棧來模擬遞歸過程,避免遞歸調用

  3. 處理大數據集
    對于非常大的數組,可以考慮將數組分段處理

這種實現方式充分利用了有序數組和二叉搜索樹的特性,通過分治策略高效地構建出平衡的二叉搜索樹。

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

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

相關文章

開疆智能Ethernet轉ModbusTCP網關連接發那科機器人與三菱PLC配置案例

本案例是三菱FX5U PLC通過ethernet/IP轉ModbusTCP網關對發那科機器人進行控制的配置案例。PLC端主要配置以太網端口設置在通信測試中&#xff0c;PLC作為主站&#xff0c;在PLC設置中選擇“以太網端口”非常關鍵&#xff0c;以確保通信測試的正常進行。1、首先&#xff0c;在PL…

VUE+SPRINGBOOT從0-1打造前后端-前后臺系統-系統首頁

在現代Web應用開發中&#xff0c;管理后臺是幾乎所有企業級應用不可或缺的部分。一個優秀的后臺首頁不僅需要提供清晰的信息展示&#xff0c;還需要具備良好的用戶體驗和視覺效果。本文將詳細介紹如何使用Vue.js框架配合Element UI組件庫和ECharts圖表庫&#xff0c;構建一個功…

第6節 torch.nn介紹

6.1 torch.nn.Module介紹 torch.nn.Module是 PyTorch 中構建神經網絡的基礎類&#xff0c;所有的神經網絡模塊都應該繼承這個類。它提供了一種便捷的方式來組織和管理網絡中的各個組件&#xff0c;包括層、參數等&#xff0c;同時還內置了許多用于模型訓練和推理的功能。 官網…

python自學筆記7 可視化初步

圖像的組成工具庫 Matplotlib&#xff1a;繪制靜態圖 Plotly: 可以繪制交互式圖片 圖像的繪制&#xff08;Matplotlib&#xff09; 創建圖形&#xff0c;軸對象 創造等差數列 # 包含后端點 arr np.linspace(0, 1, num11) # 不包含后端點 arr_no_endpoint np.linspace(0, 1, n…

GIS 常用的矢量與柵格分析工具

矢量處理工具作用典型應用緩沖區分析Buffer環境影響區域&#xff0c;空間鄰近度分析等&#xff0c;例如道路周圍一公里內的學校&#xff0c;噪音污染影響的范圍裁剪Clip例如使用A市圖層裁剪全國道路數據&#xff0c;獲取A市道路數據交集Intersect識別與LUCC、分區洪水區、基礎設…

http與https協議區別;vue3本地連接https地址接口報500

文章目錄問題解決方案一、問題原因分析二、解決方案詳解1. 保持當前配置&#xff08;推薦臨時方案&#xff09;2. 更安全的方案&#xff08;推薦&#xff09;3. 環境區分配置&#xff08;最佳實踐&#xff09;三、為什么開發環境不用配置&#xff1f;問題 問題&#xff1a;本地…

C語言——深入理解指針(三)

C語言——深入理解指針&#xff08;三&#xff09; 1.回調函數是什么&#xff1f; 首先我們來回顧一下函數的直接調用&#xff1a;而回調函數就是通過函數指針調用的函數。我們將函數的指針&#xff08;地址&#xff09;作為參數傳遞給另一個函數&#xff0c;當這個指針被用來調…

kettle 8.2 ETL項目【四、加載數據】

一、dim_store表結構,數據來源于業務表,且隨時間會有增加,屬于緩慢變化維(SCD)類型二 轉換步驟如下 詳細步驟如下

【測試報告】SoundWave(Java+Selenium+Jmeter自動化測試)

一、項目背景 隨著數字音樂內容的爆炸式增長&#xff0c;用戶對于便捷、高效的音樂管理與播放需求日益增強。傳統的本地音樂管理方式已無法滿足多設備同步、在線分享與個性化推薦等現代需求。為此&#xff0c;我們設計并開發了一款基于Spring Boot框架的SoundWave&#xff0c;旨…

C++ 類和對象詳解(1)

類和對象是 C 面向對象編程的核心概念&#xff0c;它們為代碼提供了更好的封裝性、可讀性和可維護性。本文將從類的定義開始&#xff0c;逐步講解訪問限定符、類域、實例化、對象大小計算、this 指針等關鍵知識&#xff0c;并對比 C 語言與 C 在實現數據結構時的差異&#xff0…

奈飛工廠:算法優化實戰

推薦系統的算法邏輯與優化技巧在流媒體行業的 “用戶注意力爭奪戰” 中&#xff0c;推薦系統是決定成敗的核心武器。對于擁有2.3 億全球付費用戶的奈飛&#xff08;Netflix&#xff09;而言&#xff0c;其推薦系統每天處理數十億次用戶交互&#xff0c;最終實現了一個驚人數據&…

【人工智能99問】BERT的訓練過程和推理過程是怎么樣的?(24/99)

文章目錄BERT的訓練過程與推理過程一、預訓練過程&#xff1a;學習通用語言表示1. 數據準備2. MLM任務訓練&#xff08;核心&#xff09;3. NSP任務訓練4. 預訓練優化二、微調過程&#xff1a;適配下游任務1. 任務定義與數據2. 輸入處理3. 模型結構調整4. 微調訓練三、推理過程…

[TryHackMe]Challenges---Game Zone游戲區

這個房間將涵蓋 SQLi&#xff08;手動利用此漏洞和通過 SQLMap&#xff09;&#xff0c;破解用戶的哈希密碼&#xff0c;使用 SSH 隧道揭示隱藏服務&#xff0c;以及使用 metasploit payload 獲取 root 權限。 1.通過SQL注入獲得訪問權限 手工注入 輸入用戶名 嘗試使用SQL注入…

北京JAVA基礎面試30天打卡09

1.MySQL存儲引擎及區別特性MyISAMMemoryInnoDBB 樹索引? Yes? Yes? Yes備份 / 按時間點恢復? Yes? Yes? Yes集群數據庫支持? No? No? No聚簇索引? No? No? Yes壓縮數據? Yes? No? Yes數據緩存? NoN/A? Yes加密數據? Yes? Yes? Yes外鍵支持? No? No? Yes…

AI時代的SD-WAN異地組網如何落地?

在全球化運營與數字化轉型浪潮下&#xff0c;企業分支機構、數據中心與云服務的跨地域互聯需求激增。傳統專線因成本高昂、部署緩慢、靈活性差等問題日益凸顯不足。SD-WAN以其智能化調度、顯著降本、敏捷部署和云網融合的核心優勢&#xff0c;成為實現高效、可靠、安全異地組網…

css中的color-mix()函數

color-mix() 是 CSS 顏色模塊&#xff08;CSS Color Module Level 5&#xff09;中引入的一個強大的顏色混合函數&#xff0c;用于在指定的顏色空間中混合兩種或多種顏色&#xff0c;生成新的顏色值。它解決了傳統顏色混合&#xff08;如通過透明度疊加&#xff09;在視覺一致性…

Github desktop介紹(GitHub官方推出的一款圖形化桌面工具,旨在簡化Git和GitHub的使用流程)

文章目錄**1. 簡化 Git 操作****2. 代碼版本控制****3. 團隊協作****4. 代碼托管與共享****5. 集成與擴展****6. 跨平臺支持****7. 適合的使用場景****總結**GitHub Desktop 是 GitHub 官方推出的一款圖形化桌面工具&#xff0c;旨在簡化 Git 和 GitHub 的使用流程&#xff0c;…

整數規劃-分支定界

內容來自:b站數學建模老哥 如:3.4,先找小于3的,再找大于4的 逐個

JetPack系列教程(六):Paging——讓分頁加載不再“禿”然

前言 在Android開發的世界里&#xff0c;分頁加載就像是一場永無止境的馬拉松&#xff0c;每次滾動到底部&#xff0c;都仿佛在提醒你&#xff1a;“嘿&#xff0c;朋友&#xff0c;還有更多數據等著你呢&#xff01;”但別擔心&#xff0c;Google大佬們早就看透了我們的煩惱&a…

扎實基礎!深入理解Spring框架,解鎖Java開發新境界

大家好&#xff0c;今天想和大家聊聊Java開發路上繞不開的一個重要基石——Spring框架。很多朋友在接觸SpringBoot、SpringCloud這些現代化開發工具時&#xff0c;常常會感到吃力。究其原因&#xff0c;往往是對其底層的Spring核心機制理解不夠透徹。Spring是構建這些高效框架的…