589. N叉樹的前序遍歷迭代法:null指針與棧的巧妙配合

一、題目描述

給定一個N叉樹的根節點,返回其節點值的前序遍歷結果。前序遍歷的定義是:先訪問根節點,再依次遍歷每個子節點(從左到右)。例如,對于如下N叉樹:

    1/ | \3  2  4
/ \
5  6

前序遍歷結果為:[1,3,5,6,2,4]

二、核心難點:null指針與迭代邏輯的設計

難點1:null指針的作用——標記節點處理階段

在迭代法中,我們需要模擬遞歸的“回溯”過程。null指針在此充當階段分隔符,用于區分以下兩個階段:

  1. 入棧子節點階段:當遇到非null節點時,先將所有子節點逆序入棧,再將當前節點和null入棧,標記“子節點已入棧,等待處理當前節點值”。
  2. 收集節點值階段:當遇到null時,說明其前一個節點的子節點已全部入棧,此時彈出該節點并收集值(類似遞歸中的“回溯時處理”)。

難點2:迭代邏輯的核心——棧的狀態控制

  • 子節點逆序入棧:由于棧是后進先出(LIFO),將子節點按逆序入棧(如[C,B,A]入棧,彈出順序為A,B,C),確保前序遍歷的順序(根→A→B→C)。
  • 雙棧操作:通過“非null節點入棧子節點→入棧自身和null”的模式,確保在處理完所有子節點后,才會處理當前節點值,避免重復訪問。

三、代碼解析:迭代法的完整實現

import java.util.*;class Solution {public List<Integer> preorder(Node root) {List<Integer> res = new ArrayList<>();if (root == null) return res;Stack<Node> stack = new Stack<>();stack.push(root); // 根節點入棧while (!stack.isEmpty()) {Node node = stack.pop(); // 彈出節點if (node != null) {// 1. 逆序入棧所有子節點if (node.children != null) {for (int i = node.children.size() - 1; i >= 0; i--) {stack.push(node.children.get(i));}}// 2. 入棧當前節點和null(標記處理階段)stack.push(node);stack.push(null);} else {// 遇到null,說明前一個節點的子節點已處理完畢,收集當前節點值Node valNode = stack.pop();res.add(valNode.val);}}return res;}
}

四、迭代流程模擬:以示例N叉樹為例

初始狀態

  • 棧:[1]
  • 結果:[]

第一次循環

  1. 彈出1(非null):
    • 子節點為[3,2,4],逆序入棧為4,2,3
    • 入棧1null,棧變為:[4,2,3,1,null]

第二次循環

  1. 彈出null
    • 彈出1,加入結果[1]
    • 棧變為:[4,2,3]

第三次循環

  1. 彈出3(非null):
    • 子節點為[5,6],逆序入棧為6,5
    • 入棧3null,棧變為:[4,2,6,5,3,null]

第四次循環

  1. 彈出null
    • 彈出3,加入結果[1,3]
    • 棧變為:[4,2,6,5]

第五次循環

  1. 彈出5(非null,無子節點):
    • 入棧5null,棧變為:[4,2,6,5,null]

第六次循環

  1. 彈出null
    • 彈出5,加入結果[1,3,5]
    • 棧變為:[4,2,6]

后續循環

  • 類似流程處理624,最終結果為[1,3,5,6,2,4]

五、關鍵知識點:前序與后序迭代法的對比

前序遍歷(當前代碼)

  • 核心邏輯
    非null節點→逆序入棧子節點→入棧自身和null
    確保先處理子節點,再通過null觸發收集當前節點值。

后序遍歷(修改版代碼)

public List<Integer> postorder(Node root) {List<Integer> res = new ArrayList<>();if (root == null) return res;Stack<Node> stack = new Stack<>();stack.push(root);while (!stack.isEmpty()) {Node node = stack.pop();if (node != null) {stack.push(node); // 先入棧當前節點stack.push(null); // 標記后序處理// 正序入棧子節點(與前序相反)if (node.children != null) {for (Node child : node.children) {stack.push(child);}}} else {Node valNode = stack.pop();res.add(valNode.val); // 后序收集}}return res;
}
  • 關鍵修改
    1. 子節點正序入棧(前序為逆序),確保后序遍歷順序(左→右→根)。
    2. null標記后處理當前節點,確保子節點先被處理。

六、null指針的本質:模擬遞歸的壓棧與回溯

遞歸流程迭代(棧+null)模擬
調用preorder(root)stack.push(root)
遞歸前序遍歷子節點逆序入棧子節點,壓棧root和null
回溯時處理root.val遇到null,彈出root并收集值

null指針的作用相當于遞歸中的“回溯點”,通過棧的狀態機控制,將遞歸的隱式調用棧轉化為顯式的棧操作,實現非遞歸算法。

七、總結:迭代法的優勢與適用場景

優勢

  • 空間可控:避免遞歸深度過大導致的棧溢出(如樹高為1e5時)。
  • 靈活性:可方便修改為后序、層序等其他遍歷方式(只需調整入棧順序和標記邏輯)。

適用場景

  • 所有需要深度優先遍歷(DFS)的樹結構問題,尤其是N叉樹(遞歸可能復雜)。
  • 面試中要求“非遞歸”解法的場景。

核心思想

通過棧模擬遞歸的調用棧,利用null等標記符區分節點的“預處理階段”和“回溯處理階段”,實現對遍歷順序的精確控制。理解這一思想后,可舉一反三解決二叉樹、N叉樹的各種遍歷問題。

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

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

相關文章

顯性知識的主要特征

有4個主要特征&#xff1a; 客觀存在性靜態存在性可共享性認知元能性

奧運數據可視化:探索數據講述奧運故事

在數據可視化的世界里&#xff0c;體育數據因其豐富的歷史和文化意義&#xff0c;常常成為最有吸引力的主題之一。今天我要分享一個令人著迷的奧運數據可視化項目&#xff0c;它巧妙地利用交互式圖表和動態動畫&#xff0c;展現了自1896年至今奧運會的發展歷程和各國奧運成就的…

Mysql存儲過程(附案例)

? 文章目錄 存儲過程概述1、基本語法2、變量①、系統變量②、用戶自定義變量③、局部變量 3、流程控制語句①、if語句②、參數③、case語句④、while語句⑤、repeat語句⑥、loop語句⑦、cursor游標⑧、handler 4、存儲函數 存儲過程概述 存儲過程是事先經過編譯并存儲在數據…

小波變換+注意力機制成為nature收割機

小波變換作為一種新興的信號分析工具&#xff0c;能夠高效地提取信號的局部特征&#xff0c;為復雜數據的處理提供了有力支持。然而&#xff0c;它在捕捉數據中最為關鍵的部分時仍存在局限性。為了彌補這一不足&#xff0c;我們引入了注意力機制&#xff0c;借助其能夠強化關注…

SQLMesh 增量模型從入門到精通:5步實現高效數據處理

本文深入解析 SQLMesh 中的增量時間范圍模型&#xff0c;介紹其核心原理、配置方法及高級特性。通過實際案例說明如何利用該模型提升數據加載效率&#xff0c;降低計算資源消耗&#xff0c;并提供配置示例與最佳實踐建議&#xff0c;幫助讀者在實際項目中有效應用這一強大功能。…

Android應用內存分析與優化 - 工具篇之Booster

序 在原理篇中&#xff0c;我們發現在App內存的分布中&#xff0c;Code是占大頭的部分&#xff0c;所以我們可以從App體積方面想辦法&#xff0c;通過減小App體積達到降低內存的目的&#xff0c;同時&#xff0c;根據權威的機構分析&#xff0c;體積與用戶下載和留存有很大的聯…

金屬加工液展|切削液展|2025上海金屬加工液展覽會

2025上海金屬加工液展覽會 時間&#xff1a;2025年12月2-4日 地點&#xff1a;上海新國際博覽中心 2025上海金屬加工液展規劃30000平方米展覽規模&#xff0c;預設展位1200個&#xff0c;將為國內外加工液產業提供一個集“展示、合作、交易、發展”于一體的綜合性平臺&#…

React學習———Redux 、 React Redux和react-persist

Redux Redux是一個流行的JavaScript狀態管理庫&#xff0c;通常用于React等前端框架結合使用。Redux 的設計思想是讓應用的狀態變得可預測、可追蹤、易于調試和測試。 Redux的核心l理念 單一數據源&#xff1a;整個應用的狀態被存儲在一個唯一的Store對象中&#xff0c;所有…

Python字符串常用方法詳解

文章目錄 Python字符串常用方法詳解一、字符串大小寫轉換方法(常用)1. 基礎大小寫轉換2. 案例&#xff1a;驗證碼檢查&#xff08;不區分大小寫&#xff09; 二、字符串查找與替換方法1. 查找相關方法2. 替換相關方法 三、字符串判斷方法1. 內容判斷方法 四、字符串分割與連接方…

MyBatis—動態 SQL

MyBatis—動態 SQL 一、動態 SQL 的核心作用 動態 SQL 主要解決以下問題&#xff1a; 靈活性&#xff1a;根據不同的輸入參數生成不同的 SQL 語句&#xff08;如條件查詢、批量操作&#xff09;。 可維護性&#xff1a;減少重復代碼&#xff0c;通過標簽化邏輯提高 SQL 可讀…

Python機器學習筆記(二十五、算法鏈與管道)

對于許多機器學習算法,特定數據表示非常重要。首先對數據進行縮放,然后手動合并特征,再利用無監督機器學習來學習特征。因此,大多數機器學習應用不僅需要應用單個算法,而且還需要將許多不同的處理步驟和機器學習模型鏈接在一起。Pipeline類可以用來簡化構建變換和模型鏈的…

YOLOv3深度解析:多尺度特征融合與實時檢測的里程碑

一、YOLOv3的誕生&#xff1a;繼承與突破的起點 YOLOv3作為YOLO系列的第三代算法&#xff0c;于2018年由Joseph Redmon等人提出。它在YOLOv2的基礎上&#xff0c;針對小目標檢測精度低、多類別標簽預測受限等問題進行了系統性改進。通過引入多尺度特征圖檢測、殘差網絡架構和獨…

已解決(親測有效!):安裝部署Docker Deskpot之后啟動出現Docker Engine Stopped!

文章目錄 已解決&#xff1a;安裝部署Docker Deskpot之后啟動出現Docker Engine Stopped&#xff01;個人環境介紹自己的解決問題思路&#xff08;詳細過程附截圖&#xff09;1.打開控制面板2.點擊程序和功能3.點擊啟動或關閉windows功能4.Hyper-V5.右鍵菜單欄的windows圖標點擊…

PCIE接收端檢測機制分析

PCIE接收端檢測機制分析 1、PCIE的接收端檢測機制 接收器檢測電路作為發射器的一部分實現&#xff0c;必須正確檢測是否存在與ZRX-DC參數&#xff08;40Ω-60Ω&#xff09;隱含的直流阻抗等效的負載阻抗。 接收器檢測序列的推薦行為如下&#xff1a; ?初始狀態?&#xff…

[模型部署] 3. 性能優化

&#x1f44b; 你好&#xff01;這里有實用干貨與深度分享?? 若有幫助&#xff0c;歡迎&#xff1a;? &#x1f44d; 點贊 | ? 收藏 | &#x1f4ac; 評論 | ? 關注 &#xff0c;解鎖更多精彩&#xff01;? &#x1f4c1; 收藏專欄即可第一時間獲取最新推送&#x1f514;…

InternVL3: 利用AI處理文本、圖像、視頻、OCR和數據分析

InternVL3推動了視覺-語言理解、推理和感知的邊界。 在其前身InternVL 2.5的基礎上,這個新版本引入了工具使用、GUI代理操作、3D視覺和工業圖像分析方面的突破性能力。 讓我們來分析一下是什么讓InternVL3成為游戲規則的改變者 — 以及今天你如何開始嘗試使用它。 InternVL…

鴻蒙 ArkUI - ArkTS 組件 官方 UI組件 合集

ArkUI 組件速查表 鴻蒙應用開發頁面上需要實現的 UI 功能組件如果在這 100 多個組件里都找不到&#xff0c;那就需要組合造輪子了 使用技巧&#xff1a;先判斷需要實現的組件大方向&#xff0c;比如“選擇”、“文本”、“信息”等&#xff0c;或者是某種形狀比如“塊”、“圖…

HTTP GET報文解讀

考慮當瀏覽器發送一個HTTP GET報文時&#xff0c;通過Wireshark 俘獲到下列ASCII字符串&#xff1a; GET /cs453/index.html HTTP/1.1 Host: gaia.cs.umass.edu User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax) Acc…

【Linux網絡】數據鏈路層

數據鏈路層 用于兩個設備&#xff08;同一種數據鏈路節點&#xff09;之間進行傳遞。 認識以太網 “以太網” 不是一種具體的網絡&#xff0c;而是一種技術標準&#xff1b;既包含了數據鏈路層的內容&#xff0c;也包含了一些物理層的內容。例如&#xff1a;規定了網絡拓撲結…

【打破信息差】萌新認識與入門算法競賽

閱前須知 XCPC萌新互助進步群2??&#xff1a;174495261 博客主頁&#xff1a;resot (關注resot謝謝喵) 針對具體問題&#xff0c;應當進行具體分析&#xff1b;并無放之四海而皆準的方法可適用于所有人。本人尊重并支持每位學習者對最佳學習路徑的自主選擇。本篇所列訓練方…