429. N 叉樹的層序遍歷(中等)題解

題目描述

給定一個 N 叉樹,返回其節點值的層序遍歷。(即從左到右,逐層遍歷)。

樹的序列化輸入是用層序遍歷,每組子節點都由 null 值分隔(參見示例)。

示例 1:

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

示例 2:

輸入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
輸出:[[1],[2,3,4,5],[6,7,8,9,10],[11,12,13],[14]]

提示:

  • 樹的高度不會超過 1000

  • 樹的節點總數在 [0, 10^4] 之間


問題分析

這是一道典型的樹的層序遍歷問題。與二叉樹的層序遍歷相比,N叉樹的特點是每個節點可以有任意數量的子節點。

要求:

  1. 按照層級順序遍歷樹(從上到下,從左到右)

  2. 每一層的節點值要分組返回

  3. 需要區分不同的層級

思路:

  • 使用廣度優先搜索(BFS)是最直觀的解法

  • 也可以使用深度優先搜索(DFS),配合層級信息

  • 需要記錄每個節點所在的層級


解題思路

方法一:廣度優先搜索(BFS)

BFS是解決層序遍歷問題的經典方法,因為BFS天然按照層級順序訪問節點。

算法步驟:

  1. 使用隊列存儲節點,隊列的特性保證了先進先出的層序訪問

  2. 每次處理隊列中的所有節點(即當前層的所有節點)

  3. 在處理當前層節點時,將它們的子節點加入隊列(為下一層做準備)

  4. 記錄每一層的節點值

優勢:

  • 邏輯直觀,容易理解

  • 代碼結構清晰

  • 時間復雜度優秀

方法二:深度優先搜索(DFS)

DFS通過遞歸的方式遍歷樹,同時記錄當前節點的層級信息。

算法步驟:

  1. 遞歸遍歷每個節點

  2. 傳遞層級參數,記錄當前節點所在的層

  3. 根據層級將節點值放入對應的結果列表中

  4. 遞歸處理所有子節點

優勢:

  • 代碼簡潔

  • 不需要額外的隊列數據結構

  • 遞歸思維自然


算法圖解

以示例1為例:root = [1,null,3,2,4,null,5,6]

樹結構:1/  |  \3   2   4/ \5   6

BFS執行過程:

  1. 初始狀態:隊列 = [1],結果 = []

  2. 第1層

    • 處理節點1,當前層 = [1]

    • 將節點1的子節點加入隊列:隊列 = [3,2,4]

    • 結果 = [[1]]

  3. 第2層

    • 處理節點3,2,4,當前層 = [3,2,4]

    • 將節點3的子節點加入隊列:隊列 = [5,6]

    • 結果 = [[1],[3,2,4]]

  4. 第3層

    • 處理節點5,6,當前層 = [5,6]

    • 沒有子節點,隊列為空

    • 結果 = [[1],[3,2,4],[5,6]]

DFS執行過程:

  1. 訪問節點1(level=0):result[0] = [1]

  2. 訪問節點3(level=1):result[1] = [3]

  3. 訪問節點5(level=2):result[2] = [5]

  4. 訪問節點6(level=2):result[2] = [5,6]

  5. 訪問節點2(level=1):result[1] = [3,2]

  6. 訪問節點4(level=1):result[1] = [3,2,4]


詳細代碼實現

Java 實現

Java N叉樹節點定義

// Java N叉樹節點定義
class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, List<Node> _children) {val = _val;children = _children;}
}

BFS 方法

import java.util.*;class Solution {public List<List<Integer>> levelOrder(Node root) {List<List<Integer>> result = new ArrayList<>();// 邊界條件檢查if (root == null) {return result;}// 使用隊列進行廣度優先搜索Queue<Node> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {// 當前層的節點數量int levelSize = queue.size();// 當前層的節點值列表List<Integer> currentLevel = new ArrayList<>();// 處理當前層的所有節點for (int i = 0; i < levelSize; i++) {Node currentNode = queue.poll();currentLevel.add(currentNode.val);// 將當前節點的所有子節點加入隊列if (currentNode.children != null) {for (Node child : currentNode.children) {queue.offer(child);}}}// 將當前層的結果加入最終結果result.add(currentLevel);}return result;}
}

DFS 方法

import java.util.*;class Solution {public List<List<Integer>> levelOrder(Node root) {List<List<Integer>> result = new ArrayList<>();// 邊界條件檢查if (root == null) {return result;}// 從根節點開始DFS,初始層級為0dfs(root, 0, result);return result;}private void dfs(Node node, int level, List<List<Integer>> result) {// 如果是新的層級,需要創建新的列表if (level >= result.size()) {result.add(new ArrayList<>());}// 將當前節點的值加入對應層級的列表result.get(level).add(node.val);// 遞歸處理所有子節點,層級加1if (node.children != null) {for (Node child : node.children) {dfs(child, level + 1, result);}}}
}

C# 實現

C# N叉樹節點定義

// C# N叉樹節點定義
public class Node {public int val;public IList<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, IList<Node> _children) {val = _val;children = _children;}
}

BFS 方法

using System.Collections.Generic;public class Solution {public IList<IList<int>> LevelOrder(Node root) {IList<IList<int>> result = new List<IList<int>>();// 邊界條件檢查if (root == null) {return result;}// 使用隊列進行廣度優先搜索Queue<Node> queue = new Queue<Node>();queue.Enqueue(root);while (queue.Count > 0) {// 當前層的節點數量int levelSize = queue.Count;// 當前層的節點值列表IList<int> currentLevel = new List<int>();// 處理當前層的所有節點for (int i = 0; i < levelSize; i++) {Node currentNode = queue.Dequeue();currentLevel.Add(currentNode.val);// 將當前節點的所有子節點加入隊列if (currentNode.children != null) {foreach (Node child in currentNode.children) {queue.Enqueue(child);}}}// 將當前層的結果加入最終結果result.Add(currentLevel);}return result;}
}

DFS 方法

using System.Collections.Generic;public class Solution {public IList<IList<int>> LevelOrder(Node root) {IList<IList<int>> result = new List<IList<int>>();// 邊界條件檢查if (root == null) {return result;}// 從根節點開始DFS,初始層級為0Dfs(root, 0, result);return result;}private void Dfs(Node node, int level, IList<IList<int>> result) {// 如果是新的層級,需要創建新的列表if (level >= result.Count) {result.Add(new List<int>());}// 將當前節點的值加入對應層級的列表result[level].Add(node.val);// 遞歸處理所有子節點,層級加1if (node.children != null) {foreach (Node child in node.children) {Dfs(child, level + 1, result);}}}
}

復雜度分析

BFS方法

  • 時間復雜度:O(n),其中n是樹中節點的總數。每個節點恰好被訪問一次。

  • 空間復雜度:O(n),主要是隊列和結果數組的空間開銷。最壞情況下,隊列中可能存儲接近n/2個節點(最底層)。

DFS方法

  • 時間復雜度:O(n),每個節點恰好被訪問一次。

  • 空間復雜度:O(h),其中h是樹的高度。主要是遞歸調用棧的深度,最壞情況下為O(n)(退化為鏈狀樹)。

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

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

相關文章

Java 課程,每天解讀一個簡單Java之題目:輸入一行字符,分別統計出其中英文字母、空格、數字和其它字符的個數。

package ytr250813;import java.io.IOException;public class CharacterCounter {public static void main(String[] args) throws IOException {// 初始化計數器變量int letterCount 0; // 英文字母計數器int spaceCount 0; // 空格計數器int digitCount 0; // 數字計數器i…

GitLab CI + Docker 自動構建前端項目并部署 — 完整流程文檔

一、環境準備1. 服務器準備一臺Linux服務器&#xff08;CentOS/Ubuntu皆可&#xff09;&#xff0c;推薦至少4核8GB內存已安裝 Docker&#xff08;及 Docker 服務已啟動&#xff09;已安裝 GitLab Runner2. 服務器上安裝 Docker &#xff08;如果沒裝&#xff09;# CentOS9以下…

LCP 17. 速算機器人

目錄 題目鏈接&#xff1a; 題目&#xff1a; 解題思路&#xff1a; 代碼&#xff1a; 總結&#xff1a; 題目鏈接&#xff1a; LCP 17. 速算機器人 - 力扣&#xff08;LeetCode&#xff09; 題目&#xff1a; # LCP 17. 速算機器人 小扣在秋日市集發現了一款速算機器人。…

Spring cloud集成ElastictJob分布式定時任務完整攻略(含snakeyaml報錯處理方法)

ElasticJob 是一款輕量級、可擴展的分布式定時任務解決方案&#xff0c;基于 Quartz 二次開發&#xff0c;支持任務分片、失效轉移、任務追蹤等功能&#xff0c;非常適合在 Spring Cloud 微服務場景中使用。我將帶你完成 Spring Cloud 集成 ElasticJob 的全過程&#xff0c;并分…

了解 Linux 中的 /usr 目錄以及 bin、sbin 和 lib 的演變

Linux 文件系統層次結構是一個復雜且引人入勝的體系&#xff0c;其根源深植于類 Unix 操作系統的歷史之中。在這一結構的核心&#xff0c;/usr 目錄是一個至關重要的組成部分&#xff0c;隨著時間的推移&#xff0c;它經歷了顯著的演變。與此同時&#xff0c;/bin、/sbin、/lib…

高級IO(五種IO模型介紹)

文章目錄一、IO為什么慢&#xff1f;一、阻塞IO二、非阻塞IO三、信號驅動IO四、IO多路復用五、異步IO一、IO為什么慢&#xff1f; IO操作往往都是和外設交互&#xff0c;比如鍵盤、鼠標、打印機、磁盤。而最常見的就是內存與磁盤的交互&#xff0c;要知道磁盤是機械設備&#…

第十二節:粒子系統:海量點渲染

第十二節&#xff1a;粒子系統&#xff1a;海量點渲染 引言 粒子系統是創造動態視覺效果的神器&#xff0c;從漫天繁星到熊熊火焰&#xff0c;從魔法特效到數據可視化&#xff0c;都離不開粒子技術。Three.js提供了強大的粒子渲染能力&#xff0c;可輕松處理百萬級粒子。本文將…

LeetCode Day5 -- 二叉樹

目錄 1. 啥時候用二叉樹&#xff1f; &#xff08;1&#xff09;典型問題 &#xff08;2&#xff09;核心思路 2. BFS、DFS、BST 2.1 廣度優先搜索BFS &#xff08;1&#xff09;適用任務 &#xff08;2&#xff09;解決思路??&#xff1a;使用隊列逐層遍歷 2.2 深度…

<c1:C1DateTimePicker的日期時間控件,控制日期可以修改,時間不能修改,另外控制開始時間的最大值比結束時間小一天

兩個時間控件 <c1:C1DateTimePicker Width"170" EditMode"DateTime" CustomDateFormat"yyyy-MM-dd" CustomTimeFormat"HH:mm:ss" Style"{StaticResource ListSearch-DateTimePicker}" x:Name"dateTimePicker"…

文件完整性監控工具:架構和實現

文件完整性監控(FIM)作為一道關鍵的防御層&#xff0c;確保系統和網絡中文件及文件夾的完整性與安全性。文件完整性監控工具通過監控關鍵文件的變更并檢測未經授權的修改&#xff0c;提供關于潛在安全漏洞、惡意軟件感染和內部威脅的早期警報。為了使文件完整性監控工具發揮實效…

Linux信號量和信號

1.溫故知新上一篇博客&#xff0c;我們又知道了一種進程間通信的方案&#xff1a;共享內存。它是在物理內存中用系統調用給我們在物理內存開辟一個共享內存&#xff0c;可以由多個進程的頁表進行映射&#xff0c;共享內存不和管道一樣&#xff0c;它的生命周期是隨內核的&#…

騰訊測試崗位面試真題分析

以下是對騰訊測試工程師面試問題的分類整理、領域占比分析及高頻問題精選&#xff08;基于??92道問題&#xff0c;總出現次數118次??&#xff09;。問題按??7大技術領域??劃分&#xff0c;高頻問題標注優先級&#xff08;1-5&#x1f31f;&#xff09;&#xff1a; 不…

全面解析遠程桌面:功能實現、性能優化與安全防護全攻略

遠程桌面技術已成為工作與生活中不可或缺的協作工具&#xff0c;但在實際應用中&#xff0c;用戶常遇到連接失敗、卡頓延遲、安全隱患等問題。本文從遠程桌面功能原理、網絡與性能優化、安全防護策略、跨平臺兼容性等角度&#xff0c;詳細解析常見問題的解決方案&#xff0c;并…

【問題】Mybatis-plus框架使用@Select注解編寫查詢SQL,json字段查詢轉換失敗

問題描述在使用mybaits-plus的時候定義的Mapper接口實現了BaseMapper&#xff0c;沒有編寫Mapper對應的xml&#xff0c;大部分查詢使用框架的接口進行查詢基本屬性返回都是正常&#xff0c;復雜對象在sql中會進行查詢&#xff0c;但是返回對象中卻未包含相關屬性。問題原因 沒有…

Python多線程實現大文件下載

Python多線程實現大文件下載 在互聯網時代&#xff0c;文件下載是日常操作之一&#xff0c;尤其是大文件&#xff0c;如軟件安裝包、高清視頻等。然而&#xff0c;網絡條件不穩定或帶寬有限時&#xff0c;下載速度會變得很慢&#xff0c;令人抓狂。幸運的是&#xff0c;通過多線…

【R語言】RStudio 中的 Source on Save、Run、Source 辨析

RStudio 中的 Source on Save、Run、Source 辨析 在使用 RStudio 進行 R 語言開發時&#xff0c;我們會在主界面左上角看見三個按鈕&#xff1a;Source on Save、Run、Source 。 本文將帶你從概念、使用方法、快捷鍵、使用場景以及注意事項等方面詳細解析這三個功能。 文章目錄…

藍橋杯算法之搜索章 - 4

目錄 文章目錄 前言 一、記憶化搜索 二、題目概略 三、斐波拉契數 四、Function 五、天下第一 六、滑雪 總結 親愛的讀者朋友們&#xff0c;大家好啊&#xff01;不同的時間&#xff0c;相同的地點&#xff0c;今天又帶來了關于搜索部分的講解。接下來我將接著我前面文章的內容…

抗量子加密技術前瞻:后量子時代的密碼學革命

目錄抗量子加密技術前瞻&#xff1a;后量子時代的密碼學革命1. 量子計算威脅現狀1.1 量子霸權里程碑1.2 受威脅算法1.3 時間緊迫性2. 抗量子密碼學體系2.1 技術路線對比2.2 數學基礎革新3. 標準化進程3.1 NIST PQC標準化時間線3.2 當前推薦算法4. 技術實現方案4.1 Kyber密鑰交換…

基于STM32設計的礦山環境監測系統(NBIOT)_262

文章目錄 一、前言 1.1 項目介紹 【1】開發背景 【2】研究的意義 【3】最終實現需求 【4】項目硬件模塊組成 1.2 設計思路 【1】整體設計思路 【2】上位機開發思路 1.3 項目開發背景 【1】選題的意義 【2】摘要 【3】國內外相關研究現狀 【5】參考文獻 1.4 開發工具的選擇 【1】…

電腦如何安裝win10專業版_電腦用u盤安裝win10專業版教程

電腦如何安裝win10專業版&#xff1f;電腦還是建議安裝win10專業版。Win分為多個版本&#xff0c;其中家庭版&#xff08;Home&#xff09;和專業版&#xff08;Pro&#xff09;是用戶選擇最多的兩個版本。win10專業版在功能以及安全性方面有著明顯的優勢&#xff0c;所以電腦還…