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..6b23184 --- /dev/null +++ b/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_1.py @@ -0,0 +1,42 @@ +# 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: + 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) 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..35ad373 --- /dev/null +++ b/arai60/21-29_Tree_BT_BST/23_617_Merge Two Binary Trees/level_4.py @@ -0,0 +1,44 @@ +# DFS(非破壊) +# レビューコメントを反映 +# helper関数をなくした +class Solution: + def mergeTrees( + self, root1: Optional[TreeNode], root2: Optional[TreeNode] + ) -> Optional[TreeNode]: + 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(非破壊) +# レビューコメントを反映 +class Solution: + def mergeTrees( + self, root1: Optional[TreeNode], root2: Optional[TreeNode] + ) -> Optional[TreeNode]: + + def merge_nodes(node1, node2): + if not node2: + return deepcopy(node1) + if not node1: + return deepcopy(node2) + new_node = TreeNode(node1.val + node2.val) + return new_node + + merged_root = merge_nodes(root1, root2) + nodes_queue = deque() + if root1 and root2: + nodes_queue.append((merged_root, root1, root2)) + while nodes_queue: + 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