From 92c7a54cb1f8eba9b3bde81b10c1dc6d8aa4a4bf Mon Sep 17 00:00:00 2001 From: shining-ai Date: Fri, 3 May 2024 16:29:10 +0000 Subject: [PATCH 1/2] =?UTF-8?q?=E3=80=90Grind75Hard=E3=80=912=E5=95=8F?= =?UTF-8?q?=E7=9B=AE297.=20Serialize=20and=20Deserialize=20Binary=20Tree?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../level_1.py | 45 ++++++++++++++++++ .../level_2.py | 47 +++++++++++++++++++ .../level_3.py | 45 ++++++++++++++++++ 3 files changed, 137 insertions(+) create mode 100644 grind75_hard/02_297. Serialize and Deserialize Binary Tree/level_1.py create mode 100644 grind75_hard/02_297. Serialize and Deserialize Binary Tree/level_2.py create mode 100644 grind75_hard/02_297. Serialize and Deserialize Binary Tree/level_3.py 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)) From 903d5437560e97a6c497c07ef1bcfc4d8395a425 Mon Sep 17 00:00:00 2001 From: shining-ai Date: Sat, 4 May 2024 14:48:50 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=81=AE=E5=86=85=E5=AE=B9=E3=82=92=E5=8F=8D=E6=98=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../level_4.py | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 grind75_hard/02_297. Serialize and Deserialize Binary Tree/level_4.py 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))