python-leetcode 45.二叉樹轉換為鏈表

題目:

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

展開后的單鏈表應該使用同樣的TreeNode,其中right子指針指向鏈表中的下一個節點,而左子指針始終為空

展開后的單鏈表應該與二叉樹先序遍歷順序相同


方法一:二叉樹的前序遍歷?

將二叉樹展開為單鏈表之后,單鏈表中的節點順序即為二叉樹的前序遍歷訪問各節點的順序。因此,可以對二叉樹進行前序遍歷,獲得各節點被訪問到的順序。由于將二叉樹展開為鏈表之后會破壞二叉樹的結構,因此在前序遍歷結束之后更新每個節點的左右子節點的信息,將二叉樹展開為單鏈表。

通過遞歸實現前序遍歷

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):def flatten(self, root):""":type root: Optional[TreeNode]:rtype: None Do not return anything, modify root in-place instead."""preorderList=[]#創建一個空列表,用于存儲二叉樹的所有節點def preorderTraversal(root):#遞歸函數,用于對樹進行前序遍歷if root: #前序遍歷的順序是:根 -> 左 -> 右。preorderList.append(root)preorderTraversal(root.left)preorderTraversal(root.right)preorderTraversal(root)size=len(preorderList)#二叉樹的節點總數for i in range(1,size): #從第二個節點開始,直到最后一個節點。因為鏈表的第一個節點已經由根節點 root 來表示prev,curr=preorderList[i-1],preorderList[i]#取當前節點 curr 和前一個節點 prevprev.left=None#將 prev 節點的左指針設置為 Noneprev.right=curr #將 prev 節點的右指針指向 curr

通過迭代的方式實現前序遍歷

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):def flatten(self, root):""":type root: Optional[TreeNode]:rtype: None Do not return anything, modify root in-place instead."""preorderList = []  # 初始化一個空列表用于存儲二叉樹的節點stack = []  # 初始化一個空棧用于存儲遍歷過程中暫時訪問的節點node = root# 前序遍歷二叉樹while node or stack:while node:preorderList.append(node)  # 將當前節點添加到列表中stack.append(node)  # 將當前節點添加到棧中node = node.left  # 繼續遍歷左子樹node = stack.pop()  # 當左子樹遍歷結束時,從棧中彈出一個節點,這個節點是待訪問的右子節點(即上一個節點的右子樹)node = node.right  # 繼續訪問右子樹# 構建鏈表(右子樹按前序遍歷順序連接)size = len(preorderList)for i in range(1, size):  # 從第二個節點開始(因為第一個節點已經是鏈表的頭節點)prev, curr = preorderList[i - 1], preorderList[i]prev.left = None  # 清空左子樹prev.right = curr  # 將前一個節點的右指針指向當前節點

時間復雜度:O(n),其中 n 是二叉樹的節點數。前序遍歷的時間復雜度是 O(n),前序遍歷之后,需要對每個節點更新左右子節點的信息,時間復雜度也是 O(n)。

空間復雜度:O(n),其中 n 是二叉樹的節點數。空間復雜度取決于棧(遞歸調用棧或者迭代中顯性使用的棧)和存儲前序遍歷結果的列表的大小,棧內的元素個數不會超過 n,前序遍歷列表中的元素個數是 n


方法三:尋找前驅節點

前序遍歷訪問各節點的順序是根節點、左子樹、右子樹。如果一個節點的左子節點為空,則該節點不需要進行展開操作。。如果一個節點的左子節點不為空,則該節點的左子樹中的最后一個節點被訪問之后,該節點的右子節點被訪問。該節點的左子樹中最后一個被訪問的節點是左子樹中的最右邊的節點,也是該節點的前驅節點。因此,問題轉化成尋找當前節點的前驅節點。

對于當前節點,如果其左子節點不為空,則在其左子樹中找到最右邊的節點,作為前驅節點,,將當前節點的右子節點賦給前驅節點的右子節點,然后將當前節點的左子節點賦給當前節點的右子節點,并將當前節點的左子節點設為空。對當前節點處理結束后,繼續處理鏈表中的下一個節點,直到所有節點都處理結束。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):def flatten(self, root):""":type root: Optional[TreeNode]:rtype: None Do not return anything, modify root in-place instead."""curr=rootwhile curr:if curr.left:predecessor=nxt=curr.left#用來找到左子樹中最右的節點while predecessor.right:#找到左子樹中的最右節點predecessor=predecessor.right #向右移動,尋找最右邊的節點predecessor.right=curr.right#找到左子樹中的最右節點后,將當前節點的右子樹連接到左子樹的最右節點上curr.left=None     #當前節點的左子樹被置為curr.right=nxt#將當前節點的右指針指向左子樹的根節點curr=curr.right #使curr移動到下一個節點(即當前右子樹的第一個節點),繼續遍歷   

時間復雜度:O(n)其中?n?是二叉樹的節點數。展開為單鏈表的過程中,需要對每個節點訪問一次,在尋找前驅節點的過程中,每個節點最多被額外訪問一次

空間復雜度:O(1)

源自力扣官方題解
?

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

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

相關文章

【leetcode hot 100 15】三數之和

一、兩數之和的擴展 class Solution {public List<List<Integer>> threeSum(int[] nums) {// 將得到的結果存入Set中&#xff0c;保證不重復Set<List<Integer>> set new HashSet<>();// 模擬兩數之和&#xff0c;作為第一個循環中的內容for(in…

設備健康管理系統在制造業的深度應用探索

引言 在制造業的數字化轉型浪潮中&#xff0c;設備健康管理系統正逐漸成為企業提升競爭力的關鍵利器。隨著工業 4.0 和智能制造概念的不斷深入&#xff0c;制造業對設備的高效、穩定運行提出了更高要求。設備健康管理系統借助先進的傳感器技術、物聯網&#xff08;IoT&#xf…

HTTPS 與 HTTP 的區別在哪?

HTTP與HTTPS作為互聯網數據傳輸的核心協議&#xff0c;其通信機制與安全特性深刻影響著現代網絡應用的可靠性與用戶體驗。本文將解析兩者的通信流程、安全機制及核心差異。 一、HTTP的通信機制 先來看看HTTP是什么吧。 HTTP基于TCP/IP協議棧&#xff0c;采用經典客戶端-服務…

為什么要將PDF轉換為CSV?CSV是Excel嗎?

在企業和數據管理的日常工作中&#xff0c;PDF文件和CSV文件承擔著各自的任務。PDF通常用于傳輸和展示靜態的文檔&#xff0c;而CSV因其簡潔、易操作的特性&#xff0c;廣泛應用于數據存儲和交換。如果需要從PDF中提取、分析或處理數據&#xff0c;轉換為CSV格式可能是一個高效…

【JAVAEE】多線程

【JAVAEE】多線程 一、進程1.1 進程的定義1.2 進程和線程的聯系 二、線程2.1 JConsole工具2.2 創建線程2.2.1 Thread類&#xff0c;start&#xff08;&#xff09;&#xff0c;run&#xff08;&#xff09;2.2.2 繼承Thread類2.2.3 實現Runnable接口2.2.4 匿名內部類2.2.5 使用…

手機打電話時如何識別對方按下的DTMF按鍵的字符-安卓AI電話機器人

手機打電話時如何識別對方按下的DTMF按鍵的字符 --安卓AI電話機器人 一、前言 前面的篇章中&#xff0c;使用藍牙電話攔截手機通話的聲音&#xff0c;并對數據加工&#xff0c;這個功能出來也有一段時間了。前段時間有試用的用戶咨詢說&#xff1a;有沒有辦法在手機上&#xff…

【Go】十八、http 調用服務的編寫

http接口框架的搭建 這個http接口框架的搭建參考之前的全量搭建&#xff0c;這里是快速搭建的模式&#xff1a; 直接對已有的http模塊進行復制修改&#xff0c;主要修改點在于 proto部分與api、router 部分&#xff0c;剩余的要針對進行修改模塊名稱。 接口的具體編寫 在 a…

WiseFlow本地搭建實錄---保姆教程

今天從零開始搭建了Wiseflow的本地環境搭建&#xff0c;目前使用的都是免費的API&#xff0c;我建議大家可以一起嘗試一下搭建自己的關鍵信息的數據庫&#xff0c;我是windows的環境&#xff0c;但是其他的應該也差不多&#xff0c;踩了很多坑&#xff0c;希望這篇文章能幫大家…

數的計算(藍橋云課)

題目描述 輸入一個自然數 n (n≤1000)n (n≤1000)&#xff0c;我們對此自然數按照如下方法進行處理: 不作任何處理; 在它的左邊加上一個自然數,但該自然數不能超過原數的一半; 加上數后,繼續按此規則進行處理,直到不能再加自然數為止。 問總共可以產生多少個數。 輸入描述 輸…

知識庫功能測試難點

圖表交互功能測試難點 知識庫圖表類型多&#xff0c;每種圖表交互功能不同。像柱狀圖&#xff0c;可能有點擊柱子查看詳細數據、鼠標懸停顯示數據提示等交互&#xff1b;折線圖除了這些&#xff0c;還可能支持縮放查看不同時間段數據。多種交互操作在不同圖表間存在差異&#x…

【人工智能】數據挖掘與應用題庫(201-300)

1、在LetNet5網絡中,卷積核的大小是? 答案:5*5 2、LeNet5網絡參數的數量約為? 答案:6萬 3、AlexNet與LeNet5相比,使用了哪些機制來改進模型的訓練過程? 答案: 數據增廣Dropout抑制過擬合ReLU激活函數CUDA加速神經網絡訓練4、VGGNet使用的卷積核的大小是? 答案:…

web安全滲透測試 APP安全滲透漏洞測試詳情

前言 小小白承包了一塊20畝的土地&#xff0c;依山傍水&#xff0c;風水不錯。聽朋友說去年玉米大賣&#xff0c;他也想嘗嘗甜頭&#xff0c;也就種上了玉米。 看著玉米茁壯成長&#xff0c;別提小小白心里多開心&#xff0c;心里盤算著玉米大買后&#xff0c;吃香喝辣的富貴…

CSS處理內容溢出

<!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>處理內容溢出</title><style>#d1{wid…

拉丁超立方采樣(Latin Hypercube Sampling)技術詳解及實現

拉丁超立方采樣(Latin Hypercube Sampling)技術詳解 拉丁超立方采樣(Latin Hypercube Sampling)技術詳解1. 引言2. 拉丁超立方采樣原理3. 數學公式描述4. Python代碼實現代碼解析5. 應用場景與優勢6. 在化工中的應用6.1 工藝參數優化6.2 不確定性量化與風險評估6.3 實驗設計…

docker-compose部署onlyoffice8.3.0并支持ssl,且支持通過nginx代理,關閉JWT配置

編寫docker-compose文件 mkdir -p /data/onlyoffice && echo "version: 3services:onlyoffice:container_name: OnlyOfficeimage: onlyoffice/documentserver:8.3.0restart: alwaysports:- 8088:80- 64431:443environment:TZ: Asia/ShanghaiJWT_ENABLED: falsevol…

Sliding Window Attention(滑動窗口注意力)解析: Pytorch實現并結合全局注意力(Global Attention )

Sliding Window Attention&#xff08;滑動窗口注意力&#xff09;解析 Sliding Window Attention&#xff08;滑動窗口注意力&#xff09; 是 Longformer (來源&#xff1a;https://arxiv.org/pdf/2004.05150)提出的 稀疏注意力機制&#xff0c;旨在解決 標準 Transformer 計算…

【運維】內網服務器借助通過某臺可上外網的服務器實現公網訪問

背景&#xff1a; 內網服務器無法連接公網,但是辦公電腦可以連接內網服務器又可以連接公網。 安裝軟件 1、frp 2、ccproxy 配置 1、內網服務器 # 內網服務器啟動frp服務配置文件參考vi frps.ini# frps.ini [common] bind_port 7000# 備注: bind_port端口可以隨意配置。配置完…

flask 是如何分發請求的?

這篇博客會涉及一些 WSGI 的知識&#xff0c;不了解的可以看這篇博客&#xff0c;簡單了解一下。 Python 的 WSGI 簡單入門 一、請求在 flask 中的處理過程 我們先來看一下 werkzeug.routing 包下 Map 和 Rule 方法的使用&#xff0c;這里給出一個官方的示例&#xff08;我進…

怎么獲取免費的 GPU 資源完成大語言模型(LLM)實驗

怎么獲取免費的 GPU 資源完成大語言模型(LLM)實驗 目錄 怎么獲取免費的 GPU 資源完成大語言模型(LLM)實驗在線平臺類Google ColabKaggle NotebooksHugging Face Spaces百度飛槳 AI Studio在線平臺類 Google Colab 特點:由 Google 提供的基于云端的 Jupyter 筆記本環境,提…

Python開發Django面試題及參考答案

目錄 Django 的請求生命周期是怎樣的? Django 的 MTV 架構中的各個組件分別是什么? Django 的 URL 路由是如何工作的? Django 的視圖函數和視圖類有什么區別? Django 的模板系統是如何渲染 HTML 的? Django 的 ORM 是如何工作的? Django 的中間件是什么?它的作用是…