LeetCode題練習與總結:二叉樹展開為鏈表--114

一、題目描述

給你二叉樹的根結點?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

二、解題思路

  1. 將根節點的左子樹和右子樹拉平。
  2. 將拉平后的左子樹作為右子樹,將原來的右子樹接到當前右子樹的末端。

三、具體代碼

class Solution {public void flatten(TreeNode root) {if (root == null) {return;}flatten(root.left);flatten(root.right);TreeNode left = root.left;TreeNode right = root.right;root.left = null;root.right = left;TreeNode p = root;while (p.right != null) {p = p.right;}p.right = right;}
}

四、時間復雜度和空間復雜度

1. 時間復雜度
  • 對于每個節點,我們首先遞歸地展平其左子樹,這需要 O(left) 的時間,其中 left 是左子樹中的節點數。
  • 然后,我們遞歸地展平其右子樹,這需要 O(right) 的時間,其中 right 是右子樹中的節點數。
  • 最后,我們將左子樹移動到右子樹的位置,并找到新的右子樹的末端以連接原始的右子樹。這個操作需要 O(left) 的時間。
  • 因此,對于每個節點,我們在最好情況下(沒有子節點)需要 O(1) 時間,在最壞情況下(左右子樹都有)需要 O(left + right) 時間。
  • 由于每個節點只被訪問一次,整體時間復雜度是 O(n),其中 n 是樹中節點的總數。
2. 空間復雜度
  • 空間復雜度主要取決于遞歸棧的深度,這通常與樹的高度成正比。
  • 在最壞的情況下,樹完全不平衡,例如每個節點都只有左子節點,遞歸棧的深度將是 O(n),其中 n 是樹中節點的總數。
  • 在最好的情況下,樹是完全平衡的,遞歸棧的深度將是 O(log n)。
  • 因此,空間復雜度在最壞情況下是 O(n),在最好情況下是 O(log n)。

五、總結知識點

  1. 遞歸:這是一種常用的算法設計技巧,用于將復雜問題分解為更小的子問題。在這個問題中,我們使用遞歸將樹的展平問題分解為子樹的展平問題。

  2. 二叉樹遍歷:代碼中隱式地使用了先序遍歷(根-左-右)的順序來展平二叉樹。這是通過遞歸調用?flatten(root.left)?和?flatten(root.right)?實現的。

  3. 鏈表操作:展平二叉樹的過程中,我們需要將左子樹轉換為鏈表,并將其連接到根節點的右側,然后將原始的右子樹連接到轉換后的左子樹的末端。這涉及到鏈表的基本操作,如節點的移動和連接。

  4. 指針操作:在 Java 中,我們使用?TreeNode?類型的變量來操作樹節點。這些變量實際上是指向樹中節點的指針。代碼中使用了這些指針來修改節點的左右子節點。

  5. 邊界條件處理:代碼中首先檢查?root?是否為?null,這是遞歸算法的邊界條件。如果?root?為?null,則直接返回,不再進行遞歸。

  6. 引用傳遞:在 Java 中,對象是通過引用傳遞的。這意味著當我們在遞歸調用中傳遞?root.left?和?root.right?時,我們實際上是在傳遞對樹節點對象的引用。因此,在遞歸調用中對這些節點所做的任何修改都會反映到原始樹上。

  7. 循環結構:在將左子樹移動到右子樹位置后,我們使用了一個循環結構來找到新的右子樹的末端,以便將原始的右子樹連接起來。

以上就是解決這個問題的詳細步驟,希望能夠為各位提供啟發和幫助。

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

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

相關文章

深入探討Java字符串拼接的藝術

引言 在Java編程中&#xff0c;字符串是最基本的數據類型之一。字符串拼接是開發過程中一個非常常見的操作&#xff0c;無論是構建用戶界面的文本&#xff0c;還是生成日志信息&#xff0c;都離不開字符串的拼接。然而&#xff0c;字符串拼接的效率和正確性常常被開發者忽視&a…

格式化數據恢復指南:從備份到實戰,3個技巧一網打盡

朋友們&#xff01;你們有沒有遇到過那種“啊&#xff0c;我的文件呢&#xff1f;”的尷尬時刻&#xff1f;無論是因為手滑、電腦抽風還是其他原因&#xff0c;數據丟失都可能會讓我們抓狂&#xff0c;甚至有時候&#xff0c;我們可能一不小心就把存儲設備格式化了&#xff0c;…

香橙派OrangePI AiPro測評 【運行qt,編解碼,xfreeRDP】

實物 為AI而生 打開盒子 配置 扛把子的 作為業界首款基于昇騰深度研發的AI開發板&#xff0c;Orange Pi AIpro無論在外觀上、性能上還是技術服務支持上都非常優秀。采用昇騰AI技術路線&#xff0c;集成圖形處理器&#xff0c;擁有8GB/16GB LPDDR4X&#xff0c;可以外接32…

進程通信——管道

什么是進程通信&#xff1f; 進程通信是實現進程間傳遞數據信息的機制。要實現數據信息傳遞就要進程間共享資源——內存空間。那么是哪塊內存空間呢&#xff1f;進程間是相互獨立的&#xff0c;一個進程不可能訪問其他進程的內存空間&#xff0c;那么這塊空間只能由操作系統提…

什么是RPA自動化辦公?

RPA自動化辦公&#xff1a;提升效率的利器 如今&#xff0c;自動化辦公已成為提升效率、減少錯誤、節省成本的關鍵手段。RPA&#xff08;機器人流程自動化&#xff0c;Robotic Process Automation&#xff09;作為其中的重要組成部分&#xff0c;正受到越來越多企業的青睞。那…

【全開源】簡單商城系統源碼(PC/UniAPP)

提供PC版本、UniAPP版本(高級授權)、支持多規格商品、優惠券、積分兌換、快遞鳥電子面單、支持移動端樣式、統計報表等 提供全部前后臺無加密源代碼、數據庫離線部署。 構建您的在線商店的基石 一、引言&#xff1a;為什么選擇簡單商城系統源碼&#xff1f; 在數字化時代&am…

【Spring Cloud Alibaba】初識Spring Cloud Alibaba

目錄 回顧主流的微服務框架Spring Cloud 版本簡介Spring Cloud以往的版本發布順序排列如下&#xff1a; 由停更引發的"升級慘案"哪些Netflix組件被移除了&#xff1f; 替換方案服務注冊中心&#xff1a;服務調用&#xff1a;負載均衡&#xff1a;服務降級&#xff1a…

Python—面向對象小解(6)-閉包、裝飾器

一、閉包 在Python中&#xff0c;閉包&#xff08;closure&#xff09;是一個函數對象&#xff0c;即使在其詞法作用域外被調用&#xff0c;它仍然能訪問該作用域內的變量。閉包通過“捕獲”周圍作用域的變量&#xff0c;保持這些變量的狀態&#xff0c;即使在外部函數已經返回…

干貨分享 | TSMaster 中 Hex 文件編輯器使用詳細教程

TSMaster 軟件的 Hex 文件編輯器提供了文件處理的功能&#xff0c;這一特性讓使用 TSMaster 軟件的用戶可以更便捷地對 Hex、bin、mot、s19 和 tsbinary 類型的文件進行處理。 本文重點講述 TSMaster 中 Hex 文件編輯器的使用方法&#xff0c;該編輯器能實現將現有的 Hex、bin、…

@vue-office/excel 解決移動端預覽excel文件觸發軟鍵盤

先直接上代碼 不耽誤大家時間 標明下插件庫 非常感謝作者提供預覽插件 vue-office/excel 只需要控制CSS :deep(.x-spreadsheet-overlayer) {.x-spreadsheet-selectors {display: none !important;} } :deep(.x-spreadsheet-bottombar) {li.active {user-select: none !import…

家政上門系統源碼,家政上門預約服務系統開發涉及的主要功能

家政上門預約服務系統開發是指建立一個在線平臺或應用程序&#xff0c;用于提供家政服務的預約和管理功能。該系統的目標是讓用戶能夠方便地預約各種家政服務&#xff0c;如保潔、家庭護理、月嫂、家電維修等&#xff0c;并實現服務供應商管理和訂單管理等功能。 以下是開發家政…

Windows API 速查

Windows API 函數大全 (推薦)&#xff1a;https://blog.csdn.net/xiao_yi_xiao/article/details/121604742Windows API 在線參考手冊&#xff1a;http://www.office-cn.net/t/api/index.html?web.htmWindows 開發文檔 (官方)&#xff1a;https://learn.microsoft.com/zh-cn/wi…

linux驅動學習(三)之uboot與內核編譯

需要板子一起學習的可以這里購買&#xff08;含資料&#xff09;&#xff1a;點擊跳轉 GEC6818內核源碼下載&#xff1a;點擊跳轉 一、環境配置 由于GEC6818對應是64位系統&#xff0c;虛擬機中的linux系統也要是64位&#xff0c;比如&#xff1a;ubuntu16.04.rar …

Bee 支持 與 mybatis-plus 混用嗎?

Bee 支持 與 mybatis-plus 混用嗎&#xff1f; 你是在什么場景下要混用呢? mybatis-plus是基于mybatis. 而Bee本身就是一個ORM框架了. Hibernate/MyBatis plus Sharding JDBC Jpa Spring data GraphQL App ORM (Android, 鴻蒙) Bee Bee支持的數據庫 1.MySQL 2.Oracle 3.SQL…

elasticsearch的常規操作--增刪改查和批量處理

1、_cat 查詢 GET /_cat/nodes&#xff1a; 查看所有節點 GET /_cat/health&#xff1a; 查看es 健康狀況 GET /_cat/master&#xff1a; 查看主節點 GET /_cat/indices&#xff1a;查看所有索引show databases; 2、索引一個文檔&#xff08;保存&#xff09; 保存一個數據&…

某紅書旋轉滑塊驗證碼分析與協議算法實現(高通過率)

文章目錄 1. 寫在前面2. 接口分析3. 驗證軌跡4. 算法還原 【&#x1f3e0;作者主頁】&#xff1a;吳秋霖 【&#x1f4bc;作者介紹】&#xff1a;擅長爬蟲與JS加密逆向分析&#xff01;Python領域優質創作者、CSDN博客專家、阿里云博客專家、華為云享專家。一路走來長期堅守并致…

力扣SQL50 學生們參加各科測試的次數 查詢 三表查詢

Problem: 1280. 學生們參加各科測試的次數 &#x1f468;?&#x1f3eb; 參考題解 join等價于inner join&#xff0c;不用關聯條件的join等價于cross join Code select stu.student_id,stu.student_name, sub.subject_name,count(e.subject_name) attended_exams from Stud…

關于windosw打開安全中心空白的解決方案

關于windosw打開安全中心空白的解決方案 問題如下 問題如下 之后點擊一片空白 解決方案如下 按下WINR&#xff0c;輸入regedit回車找到路徑&#xff1a;“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SecurityHealthService”&#xff0c;然后雙擊右邊的“start”…

【最新鴻蒙應用開發】——關系型數據庫簡單上手(RDB)

關系型數據庫&#xff08;RDB&#xff09; 關系型數據庫&#xff08;Relational Database&#xff0c;RDB&#xff09;是一種基于關系模型來管理數據的數據庫。關系型數據庫基于SQLite組件提供了一套完整的對本地數據庫進行管理的機制&#xff0c;對外提供了一系列的增、刪、改…

【cocos sreator】判定多邊形和多邊形相交

核心代碼&#xff1a; cc.Intersection.polygonPolygon(points2, points) 拖拽物品拖到多個目標位置判定&#xff0c;取最近的&#xff1a; getTargetItem(collider2: cc.PolygonCollider, touchPos: cc.Vec2, targetRoot: cc.Node) {let length 99999;let target null;//col…