可視化圖解算法37:序列化二叉樹-II

1. 題目

描述

請實現兩個函數,分別用來序列化和反序列化二叉樹,不對序列化之后的字符串進行約束,但要求能夠根據序列化之后的字符串重新構造出一棵與原二叉樹相同的樹。

二叉樹的序列化(Serialize)是指:把一棵二叉樹按照某種遍歷方式的結果以某種格式保存為字符串,從而使得內存中建立起來的二叉樹可以持久保存。序列化可以基于先序、中序、后序、層序的二叉樹等遍歷方式來進行修改,序列化的結果是一個字符串,序列化時通過某種符號表示空節點(#)

二叉樹的反序列化(Deserialize)是指:根據某種遍歷順序得到的序列化字符串結果str,重構二叉樹。

例如,可以根據層序遍歷的方案序列化,如下圖:

層序序列化(即用函數Serialize轉化)如上的二叉樹轉為"{1,2,3,#,#,6,7}",再能夠調用反序列化(Deserialize)將"{1,2,3,#,#,6,7}"構造成如上的二叉樹。

當然你也可以根據滿二叉樹結點位置的標號規律來序列化,還可以根據先序遍歷和中序遍歷的結果來序列化。不對序列化之后的字符串進行約束,所以歡迎各種奇思妙想。

數據范圍:節點數 n≤100,樹上每個節點的值滿足 0≤val≤150

要求:序列化和反序列化都是空間復雜度 O(n),時間復雜度 O(n)

示例1

輸入:

{1,2,3,#,#,6,7}

返回值:

{1,2,3,#,#,6,7}

說明:

如題面圖 ? ?

示例2

輸入:

{8,6,10,5,7,9,11}

返回值:

{8,6,10,5,7,9,11}

2. 解題思路

本題分為兩部分,即二叉樹的序列化與反序列化。上一篇文章《可視化圖解算法36:序列化二叉樹-I》講解的是通過前序遍歷的方法完成二叉樹的序列化與反序列化,這一篇文章講解通過層序遍歷完成二叉樹的序列化與反序列化。

先來看二叉樹的序列化(將二叉樹序列化為字符串):

可以看出二叉樹的節點值是通過層序遍歷的方式轉換為字符串的(空節點字符串為#),對于層序遍歷可以通過隊列來輔助完成(二叉樹層序遍歷詳細內容參考:《可視化圖解算法23:二叉樹的層序遍歷》)。具體思路為:

  1. 創建隊列,根節點入隊列;

  2. 節點出隊列,出隊列的節點值構成字符串,再將左右子樹入隊列;

    注:左右子樹有可能為null,也需要入隊列。

  3. 左右子樹出隊列,出隊列的節點值構成字符串的字符,再將出隊列節點的左右子樹入隊列,如此循環往復。

再來看二叉樹的反序列化(將字符串轉換為二叉樹):

二叉樹序列化的時候是通過層序遍歷的方法,反序列化的時候需要與此相對應(即也需要通過層序遍歷的思想完成)。具體思路為:

  1. 以逗號對字符串進行分割,將其轉換為數組;

  2. 基于層序遍歷的形式將數組中的字符串轉為二叉樹的節點并形成二叉樹:

    節點出隊列,根據數組中的值創建左子樹(如果當前值是#,不創建左子樹),創建的左子樹再入隊列;根據數組中的值創建右子樹(如果當前值是#,不創建左子樹),創建的右子樹再入隊列;

  3. 依次循環,直至數組中的元素取完。

如果文字描述的不太清楚,你可以參考視頻的詳細講解。

  • Python編碼:嗶哩嗶哩_bilibilihttps://www.bilibili.com/cheese/play/ep1372248

  • Java編碼:嗶哩嗶哩_bilibilihttps://www.bilibili.com/cheese/play/ep1367356

  • Golang編碼:嗶哩嗶哩_bilibilihttps://www.bilibili.com/cheese/play/ep1364781

3. 編碼實現

核心代碼如下:

type TreeNode struct {Val   intLeft  *TreeNodeRight *TreeNode
}/*** 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可** @param root TreeNode類* @return TreeNode類*/
// Serialize 二叉樹序列化為字符串
func Serialize(root *TreeNode) string {// write code hereif root == nil {return "#"}// 1. 創建隊列并賦值queue := []*TreeNode{root}res := ""// 2. 操作隊列(二叉樹節點出隊列,左右子樹入隊列)for len(queue) > 0 {// 2.1 節點出隊列node := queue[0]queue = queue[1:]if node == nil { //null節點沒有葉子節點,不需要操作res += "#" + ","continue}res += strconv.Itoa(node.Val) + ","//2.2 左子樹入隊列queue = append(queue, node.Left)//2.3 右子樹入隊列queue = append(queue, node.Right)}res = strings.TrimRight(res[:len(res)-1], ",#") //去掉末尾連續的" ,# "return res
}// Deserialize 字符串反序列化為二叉樹
func Deserialize(s string) *TreeNode {// write code hereif s == "#" || strings.TrimSpace(s) == "" {return nil}// 1. 分割(序列化的)字符串arr := strings.Split(s, ",")// 2. 創建root節點rootVal, _ := strconv.Atoi(arr[0])root := &TreeNode{Val: rootVal}// 3. 操作隊列(二叉樹節點出隊列,左右子樹入隊列)queue := []*TreeNode{root}index := 1 // arr對應的索引for index < len(arr) {// 3.1 節點出隊列node := queue[0]  // 隊列的頭節點queue = queue[1:] // 刪除隊列的頭節點// 3.2 創建左子樹并入隊列if arr[index] != "#" {leftVal, _ := strconv.Atoi(arr[index])node.Left = &TreeNode{Val: leftVal}queue = append(queue, node.Left) //添加左子樹到隊列}index++ // 移動索引(不管左子樹用到了#還是數值,都需要移動index)// 3.3 創建右子樹并入隊列if index < len(arr) && arr[index] != "#" {rightVal, _ := strconv.Atoi(arr[index])node.Right = &TreeNode{Val: rightVal}queue = append(queue, node.Right) // 添加右子樹到隊列}index++ // 移動索引的值(不管右子樹用到了#還是數值,都需要移動index)}return root
}

具體完整代碼你可以參考下面視頻的詳細講解。具體完整代碼你可以參考下面視頻的詳細講解。
  • Python編碼:數據結構筆試面試算法-Python語言版_嗶哩嗶哩_bilibili數據結構筆試面試算法-Python語言版,bilibili課堂,嗶哩嗶哩課堂,嗶哩嗶哩,Bilibili,B站,彈幕https://www.bilibili.com/cheese/play/ep1372248

  • Java編碼:嗶哩嗶哩_bilibilihttps://www.bilibili.com/cheese/play/ep1367356

  • Golang編碼:數據結構筆試面試算法-Go語言版_嗶哩嗶哩_bilibili數據結構筆試面試算法-Go語言版,bilibili課堂,嗶哩嗶哩課堂,嗶哩嗶哩,Bilibili,B站,彈幕https://www.bilibili.com/cheese/play/ep1364781

4.小結

二叉樹的序列化與反序列化可以通過層序遍歷的方法來完成,層序遍歷可以通過隊列來輔助完成。

《數據結構與算法》深度精講課程正式上線啦!七大核心算法模塊全解析:

?????????? ?鏈表

?????????? ?二叉樹

?????????? ?二分查找、排序

?????????? ?堆、棧、隊列

?????????? ?回溯算法

?????????? ?哈希算法

?????????? ?動態規劃

無論你是備戰筆試面試、提升代碼效率,還是突破技術瓶頸,這套課程都將為你構建扎實的算法思維底座。🔥立即加入學習打卡,與千名開發者共同進階!

  • Python編碼實現:數據結構筆試面試算法-Python語言版_嗶哩嗶哩_bilibili數據結構筆試面試算法-Python語言版,bilibili課堂,嗶哩嗶哩課堂,嗶哩嗶哩,Bilibili,B站,彈幕https://www.bilibili.com/cheese/play/ss897667807

  • Java編碼實現:數據結構筆試面試算法-Java語言版_嗶哩嗶哩_bilibili數據結構筆試面試算法-Java語言版,bilibili課堂,嗶哩嗶哩課堂,嗶哩嗶哩,Bilibili,B站,彈幕https://www.bilibili.com/cheese/play/ss161443488

  • Golang編碼實現:嗶哩嗶哩_bilibilihttps://www.bilibili.com/cheese/play/ss63997

對于二叉樹的相關算法,我們總結了一套【可視化+圖解】方法,依據此方法來解決相關問題,算法變得易于理解,寫出來的代碼可讀性高也不容易出錯。具體也可以參考視頻詳細講解。

今日佳句:百川東到海,何時復西歸?

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

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

相關文章

【Python】Python常用數據類型詳解

Python常用數據類型詳解:增刪改查全掌握 Python作為一門簡潔高效的編程語言,其豐富的數據類型是構建程序的基礎。本文將詳細介紹數字、字符串、列表、元組、字典、集合這六種核心數據類型的特點及增刪改查操作,并附代碼示例,助你全面掌握數據操作技巧。 一、數字(Number)…

模板引用、組件基礎

#### 組件基礎 1. 定義和使用簡單組件 - ![alt text](./img/image-2.png) vue <!-- 在App.vue里 --> <script setup>import HelloWorld from ./components/HelloWorld.vue </script> <template><HelloWorld></HelloWorld></temp…

深入探索 RKNN 模型轉換之旅

在人工智能蓬勃發展的當下&#xff0c;邊緣計算領域的應用愈發廣泛。瑞芯微的 RKNN 技術在這一領域大放異彩&#xff0c;它能讓深度學習模型在其芯片平臺上高效運行。而在整個應用流程中&#xff0c;模型轉換是極為關鍵的一環&#xff0c;今天就讓我們一同深入這個神奇的 RKNN …

iframe嵌套網站的安全機制實現

背景&#xff1a; 公司內部有一套系統A部署在內網&#xff0c;這套系統嵌套了B網站&#xff08;也是內網&#xff09;&#xff0c;只有內網才能訪問。現在需要將這個A系統暴露到公網。B系統的安全策略比較低&#xff0c;想快速上線并提高B系統的安全性。 通過 Nginx 代理層 設置…

青少年編程與數學 02-019 Rust 編程基礎 08課題、字面量、運算符和表達式

青少年編程與數學 02-019 Rust 編程基礎 08課題、字面量、運算符和表達式 一、字面量1. 字面量的分類1.1 整數字面量1.2 浮點數字面量1.3 字符字面量1.4 字符串字面量1.5 布爾字面量1.6 字節數組字面量 2. 字面量的類型推斷3. 字面量的用途4. 字面量的限制字面量總結 二、運算符…

危化品安全員職業發展方向的優劣對比

以下是危化品安全員不同職業發展方向的優劣對比&#xff1a; 縱向晉升 優勢 職業路徑清晰&#xff1a;從危化品安全員逐步晉升為安全主管、安全經理、安全總監等管理職位&#xff0c;層級明確&#xff0c;有較為清晰的上升通道。管理能力提升&#xff1a;隨著職位上升&#x…

談AI/OT 的融合

過去的十幾年間&#xff0c;工業界討論最多的話題之一就是IT/OT 融合&#xff0c;現在&#xff0c;我們不僅要實現IT/OT 的融合&#xff0c;更要面向AI/OT 的融合。看起來不太靠譜&#xff0c;卻留給我們無限的想象空間。OT 領域的專家們不要再當“九斤老太”&#xff0c;指責這…

計算機網絡核心技術解析:從基礎架構到應用實踐

計算機網絡作為現代信息社會的基石&#xff0c;承載著全球數據交換與資源共享的核心功能。本文將從網絡基礎架構、核心協議、分層模型到實際應用場景&#xff0c;全面解析計算機網絡的核心技術&#xff0c;并結合行業最新趨勢&#xff0c;為讀者構建系統的知識體系。 一、計算機…

大規模數據并行排序策略(Parallel Sample Sort)

大規模數據并行排序策略 對于上億條大型記錄的并行排序&#xff0c;基于MPI的多節點環境&#xff0c;可以采用以下策略來充分利用內存和網絡資源&#xff1a; 推薦算法&#xff1a;樣本排序(Sample Sort) 樣本排序是大規模并行排序的高效算法&#xff0c;特別適合MPI環境&am…

o.redisson.client.handler.CommandsQueue : Exception occured. Channel

1&#xff0c; 版本 <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>2.15.2</version> </dependency>2&#xff0c;問題 2025-05-12 10:46:47.436 ERROR 27780 --- [sson-netty-5-…

Kotlin跨平臺Compose Multiplatform實戰指南

Kotlin Multiplatform&#xff08;KMP&#xff09;結合 Compose Multiplatform 正在成為跨平臺開發的熱門選擇&#xff0c;它允許開發者用一套代碼構建 Android、iOS、桌面&#xff08;Windows/macOS/Linux&#xff09;和 Web 應用。以下是一個實戰指南&#xff0c;涵蓋核心概念…

【Jenkins簡單自動化部署案例:基于Docker和Harbor的自動化部署流程記錄】

摘要 本文記錄了作者使用Jenkins時搭建的一個簡單自動化部署案例&#xff0c;涵蓋Jenkins的Docker化安裝、Harbor私有倉庫配置、Ansible遠程部署等核心步驟。通過一個SpringBoot項目 (RuoYi) 的完整流程演示&#xff0c;從代碼提交到鏡像構建、推送、滾動更新&#xff0c;逐步實…

【Git】GitHub上傳圖片遇到的問題

一開始我直接在網頁上拖拽上傳&#xff0c;會說“網頁無法正常運作”。 采用git push上去&#xff1a; git clone https://github.com/your-username/your-repo-name.git cd your-repo-name git add . git commit -m "Add large images" git push origin main報錯&…

【落羽的落羽 C++】stack和queue、deque、priority_queue、仿函數

文章目錄 一、stack和queue1. 概述2. 使用3. 模擬實現 二、deque三、priority_queue1. 概述和使用2. 模擬實現 四、仿函數 一、stack和queue 1. 概述 我們之前學習的vector和list&#xff0c;以及下面要認識的deque&#xff0c;都屬于STL的容器&#xff08;containers&#x…

用生活例子通俗理解 Python OOP 四大特性

讓我們用最生活化的方式&#xff0c;結合Python代碼&#xff0c;來理解面向對象編程的四大特性。 1. 封裝&#xff1a;像使用自動售貨機 生活比喻&#xff1a; 你只需要投幣、按按鈕&#xff0c;就能拿到飲料 不需要知道機器內部如何計算找零、如何運送飲料 如果直接打開機…

軟件安全(三)實現后門程序

如下是一個經典的后門程序 #define _WINSOCK_DEPRECATED_NO_WARNINGS 1 #include<WinSock2.h> #include<windows.h> #include<iostream> #pragma comment(lib, "ws2_32.lib")int main() {//初始化網絡環境WSADATA wsaData;int result WSAStartup…

深入理解高性能網絡通信:從內核源碼到云原生實踐

深入理解高性能網絡通信&#xff1a;從內核源碼到云原生實踐 前言 隨著互聯網業務規模的高速增長&#xff0c;服務端網絡通信能力成為系統性能的核心瓶頸。如何支撐百萬級連接、在極限場景下實現低延遲高吞吐&#xff1f;本篇博客將圍繞Linux通信機制內核剖析、性能調優實戰、…

從實戰看軟件測試與質量管理:方法、過程與質量的全景解讀

作為一名高級軟件測試工程師&#xff0c;在過往多個大型系統項目的測試工作中&#xff0c;我深刻體會到&#xff1a;軟件測試不僅是產品質量的“守門員”&#xff0c;更是項目成功的“加速器”。今天這篇文章&#xff0c;我將站在實戰角度&#xff0c;結合具體案例&#xff0c;…

Megatron系列——流水線并行

內容總結自&#xff1a;bilibili zomi 視頻大模型流水線并行 注&#xff1a;這里PipeDream 1F1B對應時PP&#xff0c;Interleaved 1F1B對應的是VPP 1、樸素流水線并行 備注&#xff1a; &#xff08;1&#xff09;紅色三個圈都為空泡時間&#xff0c;GPU沒有做任何計算 &am…

在Web應用中集成Google AI NLP服務的完整指南:從Dialogflow配置到高并發優化

在當今數字化客服領域,自然語言處理(NLP)技術已成為提升用戶體驗的關鍵。Google AI提供了一系列強大的NLP服務,特別是Dialogflow,能夠幫助開發者構建智能對話系統。本文將詳細介紹如何在Web應用中集成這些服務,解決從模型訓練到高并發處理的全套技術挑戰。 一、Dialogflow…