溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

劍指offer:序列化二叉樹(shù)

發(fā)布時(shí)間:2020-05-17 06:23:49 來(lái)源:網(wǎng)絡(luò) 閱讀:519 作者:Jayce_SYSU 欄目:編程語(yǔ)言

題目描述
請(qǐng)實(shí)現(xiàn)兩個(gè)函數(shù),分別用來(lái)序列化和反序列化二叉樹(shù)

# -*- coding: utf-8 -*-
# @Time         : 2019-07-07 15:48
# @Author       : Jayce Wong
# @ProjectName  : job
# @FileName     : serializeBinaryTree.py
# @Blog         : https://blog.51cto.com/jayce1111
# @Github       : https://github.com/SysuJayce

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution:
    """
    用先序遍歷將二叉樹(shù)序列化下來(lái),然后再反序列化即可。因?yàn)檫@里的關(guān)鍵在于如何定位到根節(jié)點(diǎn),雖然用后
    序遍歷也可以定位根節(jié)點(diǎn),但是在反序列化的時(shí)候就不容易實(shí)現(xiàn)。
    """
    def Serialize(self, root):
        """
        序列化的時(shí)候正常先序遍歷二叉樹(shù)即可,但是為了準(zhǔn)確定位到葉子節(jié)點(diǎn),我們需要
        **將空節(jié)點(diǎn)也序列化下來(lái)**
        """
        def helper(pRoot, curSerial):
            if not pRoot:
                # 這里我們用'$'表示空節(jié)點(diǎn)
                curSerial.append('$')
                return

            # 用遞歸方法進(jìn)行序列化,先將根節(jié)點(diǎn)序列化,然后遍歷左子樹(shù)、右子樹(shù)
            curSerial.append(pRoot.val)
            helper(pRoot.left, curSerial)
            helper(pRoot.right, curSerial)

        if not root:
            return ''

        serialization = []
        helper(root, serialization)
        return ','.join(map(str, serialization))

    def Deserialize(self, s):
        """
        在反序列化的時(shí)候,由于構(gòu)造一個(gè)節(jié)點(diǎn)的時(shí)候默認(rèn)左右子節(jié)點(diǎn)都是空,因此如果字符串中遇到了'$',
        可以直接忽略。也就是只需要處理非空節(jié)點(diǎn)
        """
        def helper(curStr, curRoot):
            # 遞歸出口
            if not curStr:
                return curRoot
            # 這里由于我們使用一個(gè)列表保存節(jié)點(diǎn)信息,因此可以用pop()來(lái)保存剩余待反序列化的節(jié)點(diǎn)
            curVal = curStr.pop(0)
            # 如果是'$',即該節(jié)點(diǎn)為空,那么這時(shí)候由于輸入的curRoot也為空,直接返回即可
            if curVal != '$':
                # 從整體來(lái)看,我們需要先構(gòu)造根節(jié)點(diǎn),然后分別構(gòu)造其左右子節(jié)點(diǎn)。
                # 遞歸在確定了出口條件之后,就只需要將整體邏輯寫(xiě)出來(lái)就行了。
                curRoot = TreeNode(int(curVal))
                curRoot.left = helper(curStr, curRoot.left)
                curRoot.right = helper(curStr, curRoot.right)

            return curRoot

        if not s:
            return None
        s = s.split(',')
        root = helper(s, None)
        return root

def printTree(root: TreeNode):
    if not root:
        return
    print(root.val)
    printTree(root.left)
    printTree(root.right)

def main():

    solution = Solution()
    root = TreeNode(10)
    root.left = TreeNode(6)
    root.right = TreeNode(14)
    root.left.left = TreeNode(4)
    root.left.right = TreeNode(8)
    root.right.left = TreeNode(12)
    root.right.right = TreeNode(16)
    s = solution.Serialize(root)
    print(s)
    printTree(solution.Deserialize(s))

if __name__ == '__main__':
    main()
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI