| 
 | 1 | +from typing import List  | 
 | 2 | + | 
 | 3 | +# Definition for a binary tree node.  | 
 | 4 | + | 
 | 5 | + | 
 | 6 | +class TreeNode(object):  | 
 | 7 | + def __init__(self, x, left=None, right=None):  | 
 | 8 | + self.val = x  | 
 | 9 | + self.left = left  | 
 | 10 | + self.right = right  | 
 | 11 | + | 
 | 12 | + def __str__(self):  | 
 | 13 | + tree = list()  | 
 | 14 | + queue = list()  | 
 | 15 | + queue.append(self)  | 
 | 16 | + while queue and not all(node is None for node in queue):  | 
 | 17 | + currentNode = queue.pop(0)  | 
 | 18 | + if currentNode is None:  | 
 | 19 | + tree.append(None)  | 
 | 20 | + else:  | 
 | 21 | + tree.append(currentNode.val)  | 
 | 22 | + queue.append(currentNode.left)  | 
 | 23 | + queue.append(currentNode.right)  | 
 | 24 | + return str(tree)  | 
 | 25 | + | 
 | 26 | + | 
 | 27 | +class Codec:  | 
 | 28 | + | 
 | 29 | + def serialize(self, root):  | 
 | 30 | + """Encodes a tree to a single string.  | 
 | 31 | +
  | 
 | 32 | + :type root: TreeNode  | 
 | 33 | + :rtype: str  | 
 | 34 | + """  | 
 | 35 | + preorderList = list()  | 
 | 36 | + self.preorder(root, preorderList)  | 
 | 37 | + return(str(preorderList))  | 
 | 38 | + | 
 | 39 | + def preorder(self, root, preorderList):  | 
 | 40 | + if root is None:  | 
 | 41 | + # if preorderList[len(preorderList)-1] is not None:  | 
 | 42 | + preorderList.append(None)  | 
 | 43 | + return  | 
 | 44 | + preorderList.append(root.val)  | 
 | 45 | + self.preorder(root.left, preorderList)  | 
 | 46 | + self.preorder(root.right, preorderList)  | 
 | 47 | + | 
 | 48 | + def deserialize(self, data):  | 
 | 49 | + """Decodes your encoded data to tree.  | 
 | 50 | +
  | 
 | 51 | + :type data: str  | 
 | 52 | + :rtype: TreeNode  | 
 | 53 | + """  | 
 | 54 | + data = eval(data)  | 
 | 55 | + return self.recursiveDeserialize(data)  | 
 | 56 | + | 
 | 57 | + def recursiveDeserialize(self, data: List[int]) -> TreeNode:  | 
 | 58 | + if len(data) <= 0:  | 
 | 59 | + return  | 
 | 60 | + currentVal = data.pop(0)  | 
 | 61 | + if currentVal is None:  | 
 | 62 | + return  | 
 | 63 | + root = TreeNode(currentVal)  | 
 | 64 | + root.left = self.recursiveDeserialize(data)  | 
 | 65 | + root.right = self.recursiveDeserialize(data)  | 
 | 66 | + return root  | 
 | 67 | + | 
 | 68 | + | 
 | 69 | +# Your Codec object will be instantiated and called as such:  | 
 | 70 | +# ser = Codec()  | 
 | 71 | +# deser = Codec()  | 
 | 72 | +# ans = deser.deserialize(ser.serialize(root))  | 
 | 73 | + | 
 | 74 | +sol = Codec()  | 
 | 75 | +# generate test tree [1,2,3,null,null,4,5]  | 
 | 76 | +root = TreeNode(1, TreeNode(2), TreeNode(3, TreeNode(4), TreeNode(5)))  | 
 | 77 | + | 
 | 78 | +print("Original Tree:", root)  | 
 | 79 | + | 
 | 80 | +ser = sol.serialize(root)  | 
 | 81 | +print("Serialization using preorder:", ser)  | 
 | 82 | +print("Deserialized tree:", sol.deserialize(ser))  | 
0 commit comments