From dc8e78c0cd9eae385cf19caa485a8f25c224479c Mon Sep 17 00:00:00 2001 From: shining-ai Date: Tue, 12 Mar 2024 15:44:38 +0000 Subject: [PATCH 1/5] =?UTF-8?q?=E3=80=90Arai60=E3=80=9123=E5=95=8F?= =?UTF-8?q?=E7=9B=AE=20617=5FMerge=20Two=20Binary=20Trees?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../23_617_Merge Two Binary Trees/level_1.py | 43 +++++++++++++++++ .../23_617_Merge Two Binary Trees/level_2.py | 46 +++++++++++++++++++ .../23_617_Merge Two Binary Trees/level_3.py | 18 ++++++++ 3 files changed, 107 insertions(+) create mode 100644 arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_1.py create mode 100644 arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_2.py create mode 100644 arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_3.py diff --git a/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_1.py b/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_1.py new file mode 100644 index 0000000..cafa8e3 --- /dev/null +++ b/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_1.py @@ -0,0 +1,43 @@ +# DFS(破壊的) +class Solution: + def mergeTrees( + self, root1: Optional[TreeNode], root2: Optional[TreeNode] + ) -> Optional[TreeNode]: + if not root1 and not root2: + return None + if not root2: + return root1 + if not root1: + return root2 + root1.val += root2.val + root1.left = self.mergeTrees(root1.left, root2.left) + root1.right = self.mergeTrees(root1.right, root2.right) + return root1 + + +# BFS(破壊的) +class Solution: + def mergeTrees( + self, root1: Optional[TreeNode], root2: Optional[TreeNode] + ) -> Optional[TreeNode]: + + if not root1: + return root2 + if not root2: + return root1 + nodes_queue = deque([(root1, root2)]) + root1.val += root2.val + while nodes_queue: + node1, node2 = nodes_queue.popleft() + if node1.left and node2.left: + node1.left.val += node2.left.val + nodes_queue.append((node1.left, node2.left)) + if not node1.left: + node1.left = node2.left + if node1.right and node2.right: + assert node1.right and node2.right + node1.right.val += node2.right.val + nodes_queue.append((node1.right, node2.right)) + if not node1.right: + node1.right = node2.right + return root1 diff --git a/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_2.py b/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_2.py new file mode 100644 index 0000000..3ac0d81 --- /dev/null +++ b/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_2.py @@ -0,0 +1,46 @@ +# DFS +# 非破壊的に修正 +class Solution: + def mergeTrees( + self, root1: Optional[TreeNode], root2: Optional[TreeNode] + ) -> Optional[TreeNode]: + def helper_merge_trees(node1, node2): + if not node1 and not node2: + return None + if not node2: + return node1 + if not node1: + return node2 + node1.val += node2.val + node1.left = helper_merge_trees(node1.left, node2.left) + node1.right = helper_merge_trees(node1.right, node2.right) + return node1 + + sum_tree = deepcopy(root1) + return helper_merge_trees(sum_tree, root2) + + +# BFS +# 非破壊的に修正 +# nodeの結合を関数化 +class Solution: + def mergeTrees( + self, root1: Optional[TreeNode], root2: Optional[TreeNode] + ) -> Optional[TreeNode]: + + def merge_nodes(node1, node2, queue): + if node1 and node2: + node1.val += node2.val + queue.append((node1, node2)) + if not node1: + node1 = node2 + return node1, queue + + nodes_queue = deque() + sum_tree = deepcopy(root1) + sum_tree, nodes_queue = merge_nodes(sum_tree, root2, nodes_queue) + while nodes_queue: + node1, node2 = nodes_queue.popleft() + node1.left, nodes_queue = merge_nodes(node1.left, node2.left, nodes_queue) + node1.right, nodes_queue = merge_nodes(node1.right, node2.right, nodes_queue) + return sum_tree diff --git a/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_3.py b/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_3.py new file mode 100644 index 0000000..8b15593 --- /dev/null +++ b/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_3.py @@ -0,0 +1,18 @@ +class Solution: + def mergeTrees( + self, root1: Optional[TreeNode], root2: Optional[TreeNode] + ) -> Optional[TreeNode]: + def helper_merge_tree(node1, node2): + if not node1 and not node2: + return None + if not node1: + return node2 + if not node2: + return node1 + node1.val += node2.val + node1.left = helper_merge_tree(node1.left, node2.left) + node1.right = helper_merge_tree(node1.right, node2.right) + return node1 + + sum_tree = deepcopy(root1) + return helper_merge_tree(sum_tree, root2) From c06ee203382861b8ab94dc8cd026baf24bb116fa Mon Sep 17 00:00:00 2001 From: shining-ai Date: Wed, 13 Mar 2024 08:59:38 +0000 Subject: [PATCH 2/5] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=AA=E8=A8=98?= =?UTF-8?q?=E8=BF=B0=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_1.py | 1 - 1 file changed, 1 deletion(-) diff --git a/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_1.py b/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_1.py index cafa8e3..6b23184 100644 --- a/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_1.py +++ b/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_1.py @@ -35,7 +35,6 @@ def mergeTrees( if not node1.left: node1.left = node2.left if node1.right and node2.right: - assert node1.right and node2.right node1.right.val += node2.right.val nodes_queue.append((node1.right, node2.right)) if not node1.right: From fe82d5e018a917c659fc6a0673da9e59d480b1b5 Mon Sep 17 00:00:00 2001 From: shining-ai Date: Wed, 13 Mar 2024 09:52:48 +0000 Subject: [PATCH 3/5] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=82=92=E5=8F=8D=E6=98=A0=E3=81=97=E3=81=9F=E3=82=BD=E3=83=BC?= =?UTF-8?q?=E3=82=B9=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../23_617_Merge Two Binary Trees/level_4.py | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_4.py diff --git a/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_4.py b/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_4.py new file mode 100644 index 0000000..dc6ec24 --- /dev/null +++ b/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_4.py @@ -0,0 +1,43 @@ +# DFS(非破壊) +# レビューコメントを反映 +class Solution: + def mergeTrees( + self, root1: Optional[TreeNode], root2: Optional[TreeNode] + ) -> Optional[TreeNode]: + def helper_merge_trees(node1, node2): + if not node2: + return node1 + if not node1: + return deepcopy(node2) + node1.val += node2.val + node1.left = helper_merge_trees(node1.left, node2.left) + node1.right = helper_merge_trees(node1.right, node2.right) + return node1 + + root1_clone = deepcopy(root1) + return helper_merge_trees(root1_clone, root2) + + +# BFS(非破壊) +# レビューコメントを反映 +class Solution: + def mergeTrees( + self, root1: Optional[TreeNode], root2: Optional[TreeNode] + ) -> Optional[TreeNode]: + + def merge_nodes(node1, node2, queue): + if node1 and node2: + node1.val += node2.val + queue.append((node1, node2)) + if not node1: + node1 = node2 + return node1, queue + + nodes_queue = deque() + root1_clone = deepcopy(root1) + root1_clone, nodes_queue = merge_nodes(root1_clone, root2, nodes_queue) + while nodes_queue: + node1, node2 = nodes_queue.popleft() + node1.left, nodes_queue = merge_nodes(node1.left, node2.left, nodes_queue) + node1.right, nodes_queue = merge_nodes(node1.right, node2.right, nodes_queue) + return root1_clone From 517dc578ba2c36f7ed0b468af3109ef6498f7cbb Mon Sep 17 00:00:00 2001 From: shining-ai Date: Wed, 13 Mar 2024 12:18:14 +0000 Subject: [PATCH 4/5] =?UTF-8?q?DFS=E3=81=AEhelper=E9=96=A2=E6=95=B0?= =?UTF-8?q?=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../23_617_Merge Two Binary Trees/level_4.py | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_4.py b/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_4.py index dc6ec24..5ffbe84 100644 --- a/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_4.py +++ b/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_4.py @@ -1,22 +1,18 @@ # DFS(非破壊) # レビューコメントを反映 +# helper関数をなくした class Solution: def mergeTrees( self, root1: Optional[TreeNode], root2: Optional[TreeNode] ) -> Optional[TreeNode]: - def helper_merge_trees(node1, node2): - if not node2: - return node1 - if not node1: - return deepcopy(node2) - node1.val += node2.val - node1.left = helper_merge_trees(node1.left, node2.left) - node1.right = helper_merge_trees(node1.right, node2.right) - return node1 - - root1_clone = deepcopy(root1) - return helper_merge_trees(root1_clone, root2) - + if not root2: + return deepcopy(root1) + if not root1: + return deepcopy(root2) + node = TreeNode(root1.val + root2.val) + node.left = self.mergeTrees(root1.left, root2.left) + node.right = self.mergeTrees(root1.right, root2.right) + return node # BFS(非破壊) # レビューコメントを反映 From 2096d00ec3e83ebad85e733218120cc82bd52736 Mon Sep 17 00:00:00 2001 From: shining-ai Date: Wed, 13 Mar 2024 12:49:55 +0000 Subject: [PATCH 5/5] =?UTF-8?q?BFS=E3=81=A7=E3=82=82deepcopy=E3=82=92retur?= =?UTF-8?q?n=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../23_617_Merge Two Binary Trees/level_4.py | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_4.py b/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_4.py index 5ffbe84..35ad373 100644 --- a/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_4.py +++ b/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_4.py @@ -21,19 +21,24 @@ def mergeTrees( self, root1: Optional[TreeNode], root2: Optional[TreeNode] ) -> Optional[TreeNode]: - def merge_nodes(node1, node2, queue): - if node1 and node2: - node1.val += node2.val - queue.append((node1, node2)) + def merge_nodes(node1, node2): + if not node2: + return deepcopy(node1) if not node1: - node1 = node2 - return node1, queue + return deepcopy(node2) + new_node = TreeNode(node1.val + node2.val) + return new_node + merged_root = merge_nodes(root1, root2) nodes_queue = deque() - root1_clone = deepcopy(root1) - root1_clone, nodes_queue = merge_nodes(root1_clone, root2, nodes_queue) + if root1 and root2: + nodes_queue.append((merged_root, root1, root2)) while nodes_queue: - node1, node2 = nodes_queue.popleft() - node1.left, nodes_queue = merge_nodes(node1.left, node2.left, nodes_queue) - node1.right, nodes_queue = merge_nodes(node1.right, node2.right, nodes_queue) - return root1_clone + merged_node, node1, node2 = nodes_queue.popleft() + merged_node.left = merge_nodes(node1.left, node2.left) + merged_node.right = merge_nodes(node1.right, node2.right) + if node1.left and node2.left: + nodes_queue.append((merged_node.left, node1.left, node2.left)) + if node1.right and node2.right: + nodes_queue.append((merged_node.right, node1.right, node2.right)) + return merged_root