diff --git a/grind75_hard/02_297. Serialize and Deserialize Binary Tree/level_1.py b/grind75_hard/02_297. Serialize and Deserialize Binary Tree/level_1.py new file mode 100644 index 0000000..0de303b --- /dev/null +++ b/grind75_hard/02_297. Serialize and Deserialize Binary Tree/level_1.py @@ -0,0 +1,45 @@ +# BFSで実装 +class Codec: + def serialize(self, root): + """Encodes a tree to a single string. + + :type root: TreeNode + :rtype: str + """ + if not root: + return "" + serial_tree = [] + node_queue = deque([root]) + while node_queue: + node = node_queue.popleft() + if not node: + serial_tree.append("null") + continue + serial_tree.append(str(node.val)) + node_queue.append(node.left) + node_queue.append(node.right) + return ",".join(serial_tree) + + def deserialize(self, data): + """Decodes your encoded data to tree. + + :type data: str + :rtype: TreeNode + """ + if not data: + return None + data_queue = deque(list(data.split(","))) + value = data_queue.popleft() + root = TreeNode(value) + node_queue = deque([root]) + while data_queue: + left_value = data_queue.popleft() + right_value = data_queue.popleft() + node = node_queue.popleft() + if not left_value == "null": + node.left = TreeNode(left_value) + node_queue.append(node.left) + if not right_value == "null": + node.right = TreeNode(right_value) + node_queue.append(node.right) + return root diff --git a/grind75_hard/02_297. Serialize and Deserialize Binary Tree/level_2.py b/grind75_hard/02_297. Serialize and Deserialize Binary Tree/level_2.py new file mode 100644 index 0000000..af9b65a --- /dev/null +++ b/grind75_hard/02_297. Serialize and Deserialize Binary Tree/level_2.py @@ -0,0 +1,47 @@ +# DFSで実装 +class Codec: + def serialize(self, root): + """Encodes a tree to a single string. + + :type root: TreeNode + :rtype: str + """ + + serial_tree = [] + + def helper_serialize(node): + if not node: + serial_tree.append("null") + return + serial_tree.append(str(node.val)) + helper_serialize(node.left) + helper_serialize(node.right) + + helper_serialize(root) + return ",".join(serial_tree) + + def deserialize(self, data): + """Decodes your encoded data to tree. + + :type data: str + :rtype: TreeNode + """ + + def helper_deserialize(data): + value = data.popleft() + if value == "null": + return None + node = TreeNode(value) + node.left = helper_deserialize(data) + node.right = helper_deserialize(data) + return node + + + root = helper_deserialize(deque(data.split(","))) + return root + + +# Your Codec object will be instantiated and called as such: +# ser = Codec() +# deser = Codec() +# ans = deser.deserialize(ser.serialize(root)) diff --git a/grind75_hard/02_297. Serialize and Deserialize Binary Tree/level_3.py b/grind75_hard/02_297. Serialize and Deserialize Binary Tree/level_3.py new file mode 100644 index 0000000..ea6058a --- /dev/null +++ b/grind75_hard/02_297. Serialize and Deserialize Binary Tree/level_3.py @@ -0,0 +1,45 @@ +class Codec: + def serialize(self, root): + """Encodes a tree to a single string. + + :type root: TreeNode + :rtype: str + """ + + serial_tree = [] + + def helper_serialize(node): + if not node: + serial_tree.append("null") + return + serial_tree.append(str(node.val)) + helper_serialize(node.left) + helper_serialize(node.right) + + helper_serialize(root) + return ",".join(serial_tree) + + def deserialize(self, data): + """Decodes your encoded data to tree. + + :type data: str + :rtype: TreeNode + """ + + def helper_deserialize(data): + value = data.popleft() + if value == "null": + return None + node = TreeNode(value) + node.left = helper_deserialize(data) + node.right = helper_deserialize(data) + return node + + root = helper_deserialize(deque(data.split(","))) + return root + + +# Your Codec object will be instantiated and called as such: +# ser = Codec() +# deser = Codec() +# ans = deser.deserialize(ser.serialize(root)) diff --git a/grind75_hard/02_297. Serialize and Deserialize Binary Tree/level_4.py b/grind75_hard/02_297. Serialize and Deserialize Binary Tree/level_4.py new file mode 100644 index 0000000..92baa43 --- /dev/null +++ b/grind75_hard/02_297. Serialize and Deserialize Binary Tree/level_4.py @@ -0,0 +1,50 @@ +# NULL_SYMBOLを作成 +# helper_deserializeの引数をイテレータに変更 +# 変数名を修正 +class Codec: + NULL_SYMBOL = "#" + + def serialize(self, root): + """Encodes a tree to a single string. + + :type root: TreeNode + :rtype: str + """ + + serialized_tree = [] + + def helper_serialize(node): + if not node: + serialized_tree.append(self.NULL_SYMBOL) + return + serialized_tree.append(str(node.val)) + helper_serialize(node.left) + helper_serialize(node.right) + + helper_serialize(root) + return ",".join(serialized_tree) + + def deserialize(self, data): + """Decodes your encoded data to tree. + + :type data: str + :rtype: TreeNode + """ + + def helper_deserialize(data): + value = next(data) + if value == self.NULL_SYMBOL: + return None + node = TreeNode(value) + node.left = helper_deserialize(data) + node.right = helper_deserialize(data) + return node + + root = helper_deserialize(iter(data.split(","))) + return root + + +# Your Codec object will be instantiated and called as such: +# ser = Codec() +# deser = Codec() +# ans = deser.deserialize(ser.serialize(root))