劍指offer47 --- 序列化二叉樹

序列化二叉樹

題目

請實現兩個函數,分別用來序列化和反序列化二叉樹

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

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

例如,我們可以把一個只有根節點爲1的二叉樹序列化爲"1,",然後通過自己的函數來解析回這個二叉樹

分析

僅靠先序遍歷,無法還原出樹的形狀,比如4在1還是2的位置都是一樣的先序遍歷順序,都是5,3,2,4,7,6,8。但是如果在結點後面標註出None值後則可保證其唯一性,比如5,3,2,#,4,#,7,6,#,8,#。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-QP9yGN7J-1590650257469)(序列化二叉樹.assets/1590518358623.png)]

對於該題,所謂的序列化與反序列化也就是某個字符串(帶有‘#’,唯一性)和二叉樹之間的相互轉換。

代碼

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def Serialize(self, root):
        # write code here
        retList = []
        # 前序遍歷
        
        def preOrder(root):
            if root == None:
                retList.append('#')
                return
            retList.append(str(root.val))
            preOrder(root.left)
            preOrder(root.right)
        preOrder(root)
        return ' '.join(retList)
    
    def Deserialize(self, s):
        # write code here
        retList = s.split()
        def dePreOrder():
            if retList == []:
                return None
            rootVal = retList[0]
            del retList[0]
            if rootVal == '#':
                return None
            node = TreeNode(int(rootVal))
            # 遞歸左右子樹
            leftNode = dePreOrder()
            rightNode = dePreOrder()
            node.left = leftNode
            node.right = rightNode
            return node
        pRoot = dePreOrder()                  
        return pRoot
                           
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章