1. 程式人生 > >劍指offer 61. 序列化二叉樹

劍指offer 61. 序列化二叉樹

題目描述

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

思路:

最終要實現的是二叉樹的序列化和反序列化。首先來看二叉樹的序列化,二叉樹的序列化就是採用前序遍歷二叉樹輸出
節點,再碰到左子節點或者右子節點為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,必須注意該用法!!!
  • 前序遍歷方法很清奇,跟快排都是一個思路,程式碼簡單易懂,注意掌握!