BM39 序列化二叉树
生活随笔
收集整理的這篇文章主要介紹了
BM39 序列化二叉树
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
描述
請實現兩個函數,分別用來序列化和反序列化二叉樹,不對序列化之后的字符串進行約束,但要求能夠根據序列化之后的字符串重新構造出一棵與原二叉樹相同的樹。
二叉樹的序列化(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}?
- 采用前序遍歷的方式構造字符串并恢復樹
- 序列化過程
- 遞歸函數退出條件是當節點為空,則返回"#"。我們一定要用一個"#"來實現占位的操作,這樣才能保證我們的樹是唯一的,否則單獨前序遍歷出來的字符串是無法恢復成唯一的一棵樹的
- 然后我們遞歸地返回?當前值+","+遞歸左子節點+","+遞歸右子節點
- 反序列化過程
- 我們引入了一個新的結構queue來儲存字符串分割后的前序遍歷結果
- 由于前序遍歷,我們首先從queue中取出隊首,將其對象化成為一個節點
- 然后將左子節點值設為遞歸這個queue的函數返回結果
- 然后將右子節點值設為遞歸這個queue的函數返回結果
- 這正好符合了前序遍歷的規則,我們倒著又建立了這棵
總結
以上是生活随笔為你收集整理的BM39 序列化二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 混合文件下分离xml文件和jpg文件
- 下一篇: 即插即用的轻量注意力机制ECA--Net