剣指offer-シーケンス化二叉木-python

5333 ワード

タイトルの説明:
2つの関数を実装してください.それぞれシリアル化と逆シーケンス化のツリーに使用します.
  • ツリーのシーケンス化:1本のツリーを何らかの遍歴方式の結果に従って何らかのフォーマットで文字列として保存し、メモリに構築されたツリーを永続的に保存することを指す.シーケンス化は、シーケンス、中シーケンス、後シーケンス、レイヤシーケンスのツリー遍歴方式に基づいて変更できます.シーケンス化の結果は文字列であり、シーケンス化時にある記号で空のノード(#)を表します.ノード値の終了を表します(value!).
  • ツリーの逆シーケンス化:ある遍歴順序に基づいて得られたシーケンス化文字列結果strを指し、ツリーを再構成する.

  • 考え方:
  • シーケンス化:シーケンス遍歴、文字列間用','間隔
  • 逆シーケンス前シーケンスは「ルート左右」の順序を遍歴し、ルートノードはその左右のサブノードの前に位置し、すなわち非空(#)の最初のノードはあるサブツリーのルートノードであり、左右のサブノードはそのルートノードの後に、空のノード#を区切り記号とする.

  • ACコード
    # -*- 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
            if not root:
                return '#'
            return str(root.val) +',' + self.Serialize(root.left) +','+ self.Serialize(root.right)
        
        def Deserialize(self, s):
            list = s.split(',')
            return self.deserializeTree(list)
    
        def deserializeTree(self, list):
            if len(list)<=0:
                return None
            val = list.pop(0)
            root = None
            if val != '#':
                root = TreeNode(int(val))
                root.left = self.deserializeTree(list)
                root.right = self.deserializeTree(list)
            return root