刷題系列 - 序列化和反序列化一個二叉樹
序列化和反序列化一個二叉樹,是很開放的一題,就是給出一個二叉樹,用序列化方法生成一個字串;然後用反序列化方法把這個字串生成原來二叉樹。這個在程式設計時候各個型別一般都有序列化的,用於儲存。
這裡面要用到python中list轉化字串方法 ','.join(list), 和字串轉換為list的方法string.split(',')。
其實可以用之前刷題的幾個題目來組合,比如遍歷二叉樹生成中序和後序兩個佇列,合併為一個佇列,作為序列化方法;然後有一題是按照中序和後序佇列生成二叉樹,就可以作為反序列化的方法使用。當然,這樣會有很多冗餘資料。
其實這個題目比較麻煩的地方就是最佳化,實現倒是很不難。
我這邊用了序列化層級遍歷,就是從根節點到葉子節點一層層按照從左到用遍歷,如果某個節點的左或者右子節點為空,用#號代替;最後葉子節點下面會都是”#“號,這裡做了個判斷,如果某層都是#號,視作為空,結束遍歷。
反序列化採用對應的方法,這裡不多說,看程式碼即可。
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Codec: def serialize(self, root): """Encodes a tree to a single string. :type root: TreeNode :rtype: str """ if root != None: checkList = [root] else: checkList = [] AllNodeList = [] while checkList != []: nextList = [] for Node in checkList: if Node != '#': AllNodeList.append(str(Node.val)) if Node.left == None: nextList.append('#') else: nextList.append(Node.left) if Node.right == None: nextList.append('#') else: nextList.append(Node.right) else: AllNodeList.append(Node) if len(set(nextList)) == 1 and '#' in nextList: nextList = [] checkList = nextList return ','.join(AllNodeList) def deserialize(self, data): """Decodes your encoded data to tree. :type data: str :rtype: TreeNode """ if data == '': currentLevel = [] root = None else: AllNodeList = data.split(",") root = TreeNode(int(AllNodeList.pop(0))) currentLevel =[root] while currentLevel != [] and AllNodeList!= []: nextLevel = [] for node in currentLevel: leftValue = AllNodeList.pop(0) if leftValue != '#': node.left = TreeNode(int(leftValue)) nextLevel.append(node.left) rightValue = AllNodeList.pop(0) if rightValue != '#': node.right = TreeNode(int(rightValue)) nextLevel.append(node.right) print([node.val for node in nextLevel]) currentLevel = nextLevel return root # Your Codec object will be instantiated and called as such: # codec = Codec() # codec.deserialize(codec.serialize(root))
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2675651/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 面試題37:序列化二叉樹面試題二叉樹
- 序列化二叉樹二叉樹
- JZ-061-序列化二叉樹二叉樹
- 《劍指offer》:[62]序列化二叉樹二叉樹
- 一文帶你看懂二叉樹的序列化二叉樹
- LeetCode 297. Serialize and Deserialize Binary Tree 二叉樹序列化反序列化LeetCode二叉樹
- 刷題系列 - Python判斷是否映象對稱二叉樹Python二叉樹
- 刷題系列 - 用遞迴和遍歷兩個方法反轉一個單鏈佇列遞迴佇列
- Redis在存取序列化和反序列化效能問題Redis
- Java:對一個物件序列化和反序列化的簡單實現Java物件
- 夯實Java基礎系列22:一文讀懂Java序列化和反序列化Java
- 刷題系列 - Python用遞迴實現求二叉樹深度Python遞迴二叉樹
- 刷題系列 - Python實現二叉樹按層級遍歷Python二叉樹
- 刷題系列 - 中序和後序遍歷佇列,構造對應二叉樹;佇列二叉樹
- Java的序列化和反序列化Java
- C++ 序列化和反序列化C++
- 刷題系列 - 在給出二叉樹中兩個點,求出其最小共同父節點二叉樹
- 刷題系列 - 給出前序和後序遍歷佇列,構造對應二叉樹佇列二叉樹
- 【刷題】二叉樹非遞迴遍歷二叉樹遞迴
- 序列化和反序列化pickle和json 模組JSON
- python的序列化和反序列化Python
- PHP的序列化和反序列化入門PHP
- [Java基礎]序列化和反序列化Java
- 刷題系列 - 在二叉樹中,為每個節點關聯其右相鄰節點二叉樹
- 刷題系列 - Python用非遞迴實現二叉樹前序遍歷Python遞迴二叉樹
- Python中物件序列化和反序列化Python物件
- .NET物件的XML序列化和反序列化物件XML
- C#序列化和反序列化(json)C#JSON
- 物件(List<T>)的序列化和反序列化物件
- 為什麼需要序列化和反序列化
- 刷題系列 - Python用非遞迴實現二叉樹後續遍歷Python遞迴二叉樹
- 刷題系列 - Python用非遞迴實現二叉樹中序遍歷Python遞迴二叉樹
- Java物件的序列化和反序列化實踐Java物件
- 從java的序列化和反序列化說起Java
- Java序列化和hessian序列化的區別Java
- 物件序列化(序列化)物件
- Java序列化、反序列化、反序列化漏洞Java
- 相同二叉樹和鏡面二叉樹問題二叉樹