【LeetCode熱題100道筆記】二叉樹展開為鏈表

題目描述

給你二叉樹的根結點 root ,請你將它展開為一個單鏈表:

展開后的單鏈表應該同樣使用 TreeNode ,其中 right 子指針指向鏈表中下一個結點,而左子指針始終為 null 。
展開后的單鏈表應該與二叉樹 先序遍歷 順序相同。

示例 1:
在這里插入圖片描述
輸入:root = [1,2,5,3,4,null,6]
輸出:[1,null,2,null,3,null,4,null,5,null,6]

示例 2:
輸入:root = []
輸出:[]

示例 3:
輸入:root = [0]
輸出:[0]

提示:
樹中結點數在范圍 [0, 2000] 內
-100 <= Node.val <= 100

進階:你可以使用原地算法(O(1) 額外空間)展開這棵樹嗎?

思考:前序遍歷+左子樹鏈表化

核心是遞歸處理左右子樹:先將左、右子樹分別展開為鏈表,再將左子樹鏈表接到根節點的右指針,最后將原右子樹鏈表接到左子樹鏈表的尾部,實現“根→左子樹鏈表→右子樹鏈表”的前序順序。

算法過程

  1. 遞歸終止條件:若當前節點為null(空樹/葉子節點的子樹),返回null(無需處理)。
  2. 遞歸展開子樹
    • 遞歸展開左子樹,得到左子樹鏈表的頭節點left
    • 遞歸展開右子樹,得到右子樹鏈表的頭節點right
  3. 重組當前節點的指針
    • 將當前節點的右指針指向左子樹鏈表(root.right = left),左指針置為nullroot.left = null);
    • 遍歷左子樹鏈表至尾部(找到最后一個節點),將其右指針指向右子樹鏈表(current.right = right)。
  4. 返回當前節點:作為上層節點的左/右子樹鏈表頭,完成遞歸回溯。

時空復雜度

  • 時間復雜度:O(n),n為二叉樹節點總數。
    原因:每個節點僅被訪問1次(遞歸處理),遍歷左子樹鏈表尾部的操作總次數為O(n)(每個節點最多被遍歷1次),總時間與節點數線性相關。
  • 空間復雜度:O(h),h為二叉樹高度。
    原因:遞歸調用棧深度取決于樹高,平衡樹h=O(log n),鏈狀樹h=O(n);額外空間僅為遞歸棧,無其他存儲開銷。

代碼(前序遍歷版)

/*** Definition for a binary tree node.* function TreeNode(val, left, right) {*     this.val = (val===undefined ? 0 : val)*     this.left = (left===undefined ? null : left)*     this.right = (right===undefined ? null : right)* }*/
/*** @param {TreeNode} root* @return {void} Do not return anything, modify root in-place instead.*/
var flatten = function(root) {preOrder(root);
};// 輔助函數:將以root為根的樹展開為鏈表,返回展開后的頭節點
function preOrder(root) {if (!root) return null; // 空節點直接返回// 遞歸展開左、右子樹let left = preOrder(root.left);let right = preOrder(root.right);// 1. 將左子樹鏈表接到根節點的右指針,左指針置空root.right = left;root.left = null;// 2. 找到左子樹鏈表的尾部,將右子樹鏈表接在其后let current = root;while (current.right) { // 遍歷至左子樹鏈表的最后一個節點current = current.right;}current.right = right;return root; // 返回當前節點作為上層的子樹鏈表頭
}

關鍵邏輯解析

  1. 為何用前序遍歷?
    題目要求展開后的鏈表順序與前序遍歷一致(根→左→右),前序遍歷的遞歸順序天然匹配這一需求:先處理根節點,再處理左子樹,最后處理右子樹,確保重組后的指針順序正確。

  2. 左指針為何必須置空?
    展開后的鏈表要求所有節點的左指針為null,僅保留右指針指向后續節點。若不置空左指針,會導致鏈表中殘留左子樹引用,破壞“鏈表”的結構定義。

  3. 如何高效找到左子樹鏈表的尾部?
    代碼中通過while (current.right)循環遍歷左子樹鏈表至尾部,這是最直觀的實現。對于極端情況(左子樹為鏈狀),該操作時間復雜度為O(k)(k為左子樹節點數),但整棵樹的總遍歷次數仍為O(n)(每個節點最多被遍歷1次),不影響整體時間復雜度。

  4. 是否可以優化空間復雜度?
    上述遞歸實現的空間復雜度為O(h),若需進一步優化至O(1),可采用Morris遍歷(線索化遍歷),通過修改空指針臨時指向前驅/后繼節點,避免遞歸棧開銷,但代碼邏輯會更復雜。

示例解析(以 root = [1,2,5,3,4,null,6] 為例)

  1. 遞歸展開左子樹(2→3→4)和右子樹(5→6);
  2. 根節點1的右指針指向左子樹2,左指針置空;
  3. 遍歷左子樹鏈表至尾部(4),將其右指針指向右子樹5;
  4. 最終鏈表為:1→2→3→4→5→6,符合前序遍歷順序。

該過程通過遞歸自然實現了“根→左→右”的順序重組,確保鏈表結構正確且原地修改(不創建新節點)。

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

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

相關文章

華為OmniPlacement技術深度解析:突破超大規模MoE模型推理瓶頸的創新設計

MoE模型的崛起與負載均衡挑戰 混合專家模型&#xff08;Mixture of Experts&#xff0c;MoE&#xff09;作為大規模深度學習的前沿架構&#xff0c;通過稀疏激活模式成功地將模型參數規模推向了新的高度&#xff0c;同時保持了相對合理的計算成本。其核心思想是使用多個專門的…

分享一個基于Python+大數據的房地產一手房成交數據關聯分析與可視化系統,基于機器學習的深圳房產價格走勢分析與預測系統

&#x1f495;&#x1f495;作者&#xff1a;計算機源碼社 &#x1f495;&#x1f495;個人簡介&#xff1a;本人八年開發經驗&#xff0c;擅長Java、Python、PHP、.NET、Node.js、Spark、hadoop、Android、微信小程序、爬蟲、大數據、機器學習等&#xff0c;大家有這一塊的問題…

【C++題解】DFS和BFS

4小時編碼練習計劃&#xff0c;專注于深度優先搜索&#xff08;DFS&#xff09;和廣度優先搜索&#xff08;BFS&#xff09;這兩種基本且強大的算法。 下午 (4小時): 搜索算法專題——DFS與BFS DFS和BFS是圖論和多種問題求解中的基石算法。深刻理解它們的原理、差異和代碼實現模…

Android模擬簡單的網絡請求框架Retrofit實現

文章目錄1.靜態代理2.動態代理3.實現簡單的Retrofit定義對應的請求注解參數通過動態代理模擬Retrofit的創建請求參數的處理定義請求接口測試請求1.靜態代理 代理默認給某一個對象提供一個代理對象&#xff0c;并由代理對象控制對原對象的引用。通俗來講&#xff0c;代理模式就…

Matter安全實現

Matter分析與安全驗證 上一篇文章簡單的介紹了Matter的架構、實現、以及部分安全驗證過程&#xff1b;這里繼續補充一下Matter的其他安全驗證流程&#xff0c;以更好的實現Matter安全。 Matter提供的安全實現流程大概總結起來是這個流程 硬件信任根→安全啟動→動態證書→加密…

從基礎到實踐:Web核心概念與Nginx入門全解析

從基礎到實踐&#xff1a;Web核心概念與Nginx入門全解析 文章目錄從基礎到實踐&#xff1a;Web核心概念與Nginx入門全解析一、Web是什么&#xff1f;從基本概念到核心架構1.1 Web的本質&#xff1a;一個超文本信息系統1.2 B/S架構&#xff1a;Web的“前端-后端”分工模式二、一…

【完整源碼+數據集+部署教程】加工操作安全手套與手部檢測系統源碼和數據集:改進yolo11-cls

背景意義 研究背景與意義 隨著工業自動化和智能制造的迅速發展&#xff0c;工人安全問題日益受到重視。特別是在涉及重型機械和危險操作的工作環境中&#xff0c;工人手部的安全保護顯得尤為重要。傳統的安全手套雖然在一定程度上能夠保護工人的手部&#xff0c;但在復雜的加工…

代碼隨想錄算法訓練營第一天 || (雙指針)27.移除元素 26.刪除有序數組中的重復項 283.移動零 977.有序數組的平方

代碼隨想錄算法訓練營第一天 || (雙指針)27.移除元素 26.刪除有序數組中的重復項 283.移動零 27.移除元素 暴力方法 同向雙指針雙指針 自己AC的解答 卡哥的講解 26.刪除有序數組中的重復項 同向雙指針 283.移動零 自己解答 靈神做法(同向雙指針+交換) 977.有序數組的平方 暴…

Java全棧開發工程師面試實錄:從基礎到實戰的深度探討

Java全棧開發工程師面試實錄&#xff1a;從基礎到實戰的深度探討 一、初識與自我介紹 面試官&#xff08;李工&#xff09;&#xff1a; 你好&#xff0c;歡迎來到我們公司。我是負責技術面試的李工&#xff0c;今天我們將進行一場關于Java全棧開發的深入交流。你可以先簡單介紹…

Kafka:Java開發的消息神器,你真的懂了嗎?

Kafka&#xff1a;Java開發的消息神器&#xff0c;你真的懂了嗎&#xff1f; 一、Kafka 是什么鬼&#xff1f; 想象一下&#xff0c;你在網上瘋狂剁手后&#xff0c;滿心期待著快遞包裹的到來。這時候&#xff0c;快遞站就像是 Kafka&#xff0c;而你的包裹就是消息。快遞站接…

深度學習之第八課遷移學習(殘差網絡ResNet)

目錄 簡介 一、遷移學習 1.什么是遷移學習 2. 遷移學習的步驟 二、殘差網絡ResNet 1.了解ResNet 2.ResNet網絡---殘差結構 三、代碼分析 1. 導入必要的庫 2. 模型準備&#xff08;遷移學習&#xff09; 3. 數據預處理 4. 自定義數據集類 5. 數據加載器 6. 設備配置…

Pinia 兩種寫法全解析:Options Store vs Setup Store(含實踐與場景對比)

目標&#xff1a;把 Pinia 的兩種寫法講透&#xff0c;寫明“怎么寫、怎么用、怎么選、各自優缺點與典型場景”。全文配完整代碼與注意事項&#xff0c;可直接當團隊規范參考。一、背景與準備 適用版本&#xff1a;Vue 3 Pinia 2.x安裝與初始化&#xff1a; # 安裝 npm i pini…

setup函數相關【3】

目錄1.setup函數&#xff1a;1.概述&#xff1a;2.案例分析&#xff1a;2.setup函數的優化&#xff1a;&#xff08;setup語法糖&#xff09;優化1&#xff1a;優化2&#xff1a;安裝插件&#xff1a;安裝指令&#xff1a;只對當前項目安裝配置vite.config.ts&#xff1a;代碼編…

如何通過AI進行數據資產梳理

最終產出 數據資產清單 包含所有數據資產的詳細目錄,列出數據集名稱、描述、所有者、格式、存儲位置和元數據。 用途:幫助政府部門清晰了解數據資產分布和狀態。 數據質量報告 數據質量評估結果,記錄準確性、完整性、一致性等問題及改進建議,基于政府認可的數據質量框架(如…

【傳奇開心果系列】Flet框架結合pillow實現的英文文字倒映特效自定義模板特色和實現原理深度解析

Flet框架結合pillow實現的英文文字倒映特效自定義模板特色和實現原理深度解析 一、效果展示截圖 二、使用場景 三、特色說明 四、概括說明 五、依賴文件列表 六、安裝依賴命令 七、 項目結構建議 八、注意事項 九、Flet 文字倒影效果實現原理分析 (一)組件結構與功能 1. 圖像…

2025最新深度學習面試必問100題--理論+框架+原理+實踐 (下篇)

2025最新深度學習面試必問100題–理論框架原理實踐 (下篇) 在上篇中&#xff0c;我們已經深入探討了機器學習基礎、CNN、RNN及其變體&#xff0c;以及模型優化的核心技巧。 在下篇中&#xff0c;我們將把目光投向更遠方&#xff0c;聚焦于當今AI領域最炙手可熱的前沿。我們將深…

原子工程用AC6編譯不過問題

…\Output\atk_h750.axf: Error: L6636E: Pre-processor step failed for ‘…\User\SCRIPT\qspi_code.scf.scf’修改前&#xff1a; #! armcc -E ;#! armclang -E --targetarm-arm-none-eabi -mcpucortex-m7 -xc /* 使用說明 ! armclang -E --targetarm-arm-none-eabi -mcpuco…

Python有哪些經典的常用庫?(第一期)

目錄 1、NumPy (數值計算基礎庫) 核心特點&#xff1a; 應用場景&#xff1a; 代碼示例&#xff1a; 2、Pandas (數據分析處理庫) 應用場景&#xff1a; 代碼示例&#xff1a; 3、Scikit-learn (機器學習庫) 核心特點&#xff1a; 應用場景&#xff1a; 代碼示例&am…

現代 C++ 高性能程序驅動器架構

&#x1f9e0; 現代 C 高性能程序驅動器架構M/PA&#xff08;多進程&#xff09;是隔離的“孤島”&#xff0c;M/TA&#xff08;多線程&#xff09;是共享的“戰場”&#xff0c;EDSM&#xff08;事件驅動&#xff09;是高效的“反應堆”&#xff0c;MDSM&#xff08;消息驅動&…

投資儲能項目能賺多少錢?小程序幫你測算

為解決電網負荷平衡、提升新能源消納等問題&#xff0c;儲能項目的投資開發越來越多。那么&#xff0c;投資儲能項目到底能賺多少錢&#xff1f;適不適合投資&#xff1f;用“綠蟲零碳助手”3秒鐘精準測算。操作只需四步&#xff0c;簡單易懂&#xff1a;1.快速登錄&#xff1a…