劍指offer 61. 序列化二叉樹
阿新 • • 發佈:2018-11-26
題目描述
請實現兩個函式,分別用來序列化和反序列化二叉樹。
思路:
最終要實現的是二叉樹的序列化和反序列化。首先來看二叉樹的序列化,二叉樹的序列化就是採用前序遍歷二叉樹輸出
節點,再碰到左子節點或者右子節點為None的時候輸出一個特殊字元”#”。對於反序列化,就是針對輸入的一個序列構建一棵
二叉樹,我們可以設定一個指標先指向序列的最開始,然後把指標指向位置的數字轉化為二叉樹的結點,後移一個數字,繼續
轉化為左子樹和右子樹。當遇到當前指向的字元為特殊字元”#”或者指標超出了序列的長度,則返回None,指標後移,繼續遍歷。
參考答案:
# -*- coding:utf-8 -*- class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: flag = -1 def Serialize(self, root): # write code here if not root: return '#' return str(root.val) + ',' + self.Serialize(root.left) + ',' + self.Serialize(root.right) def Deserialize(self, s): # write code here self.flag += 1 l = s.split(',') # flag每次加1,從0開始,不能超過字串長度,否則返回None if self.flag >= len(s): return None root = None # 新建一個樹物件來反序列化字串 if l[self.flag] != '#': # 往樹中存值,遞迴輸入s沒問題,因為l[self.flag]是不斷往後取值的 root = TreeNode(int(l[self.flag])) root.left = self.Deserialize(s) root.right = self.Deserialize(s) return root
Note
- 重點注意,其中
flag
定義時候是在def 函式之外,直接就是flag
,若是定義為self.flag
反倒是錯誤的,而在def函式中使用的時候,則必須標明為self.flag
,必須注意該用法!!! - 前序遍歷方法很清奇,跟快排都是一個思路,程式碼簡單易懂,注意掌握!