diff --git a/arai60/21-29_Tree_BT_BST/29_105_Construct Binary Tree from Preorder and Inorder Traversal/level_1.py b/arai60/21-29_Tree_BT_BST/29_105_Construct Binary Tree from Preorder and Inorder Traversal/level_1.py new file mode 100644 index 0000000..40ab3c8 --- /dev/null +++ b/arai60/21-29_Tree_BT_BST/29_105_Construct Binary Tree from Preorder and Inorder Traversal/level_1.py @@ -0,0 +1,21 @@ +class Solution: + def buildTree( + self, preorder: List[int], inorder: List[int] + ) -> Optional[TreeNode]: + current_preorder_index = 0 + + def array_to_tree(split_inorder): + nonlocal current_preorder_index + if current_preorder_index >= len(preorder): + return None + val = preorder[current_preorder_index] + if not val in split_inorder: + return None + current_preorder_index += 1 + node = TreeNode(val) + inorder_index = split_inorder.index(val) + node.left = array_to_tree(split_inorder[:inorder_index]) + node.right = array_to_tree(split_inorder[inorder_index + 1 :]) + return node + + return array_to_tree(inorder) diff --git a/arai60/21-29_Tree_BT_BST/29_105_Construct Binary Tree from Preorder and Inorder Traversal/level_2.py b/arai60/21-29_Tree_BT_BST/29_105_Construct Binary Tree from Preorder and Inorder Traversal/level_2.py new file mode 100644 index 0000000..e38cf06 --- /dev/null +++ b/arai60/21-29_Tree_BT_BST/29_105_Construct Binary Tree from Preorder and Inorder Traversal/level_2.py @@ -0,0 +1,24 @@ +# 再帰関数の引数をinorderのindexで管理 +class Solution: + def buildTree( + self, preorder: List[int], inorder: List[int] + ) -> Optional[TreeNode]: + inorder_index_map = {} + for i, val in enumerate(inorder): + inorder_index_map[val] = i + + current_preorder_index = 0 + + def array_to_tree(inorder_left, inorder_right): + nonlocal current_preorder_index + if inorder_left > inorder_right: + return None + val = preorder[current_preorder_index] + node = TreeNode(val) + inorder_index = inorder_index_map[val] + current_preorder_index += 1 + node.left = array_to_tree(inorder_left, inorder_index - 1) + node.right = array_to_tree(inorder_index + 1, inorder_right) + return node + + return array_to_tree(0, len(inorder) - 1) diff --git a/arai60/21-29_Tree_BT_BST/29_105_Construct Binary Tree from Preorder and Inorder Traversal/level_3.py b/arai60/21-29_Tree_BT_BST/29_105_Construct Binary Tree from Preorder and Inorder Traversal/level_3.py new file mode 100644 index 0000000..24d96a6 --- /dev/null +++ b/arai60/21-29_Tree_BT_BST/29_105_Construct Binary Tree from Preorder and Inorder Traversal/level_3.py @@ -0,0 +1,23 @@ +class Solution: + def buildTree( + self, preorder: List[int], inorder: List[int] + ) -> Optional[TreeNode]: + inorder_index_map = {} + for i, val in enumerate(inorder): + inorder_index_map[val] = i + + current_preorder_index = 0 + + def array_to_tree(inorder_left, inorder_right): + nonlocal current_preorder_index + if inorder_left > inorder_right: + return None + val = preorder[current_preorder_index] + node = TreeNode(val) + inorder_index = inorder_index_map[val] + current_preorder_index += 1 + node.left = array_to_tree(inorder_left, inorder_index - 1) + node.right = array_to_tree(inorder_index + 1, inorder_right) + return node + + return array_to_tree(0, len(inorder) - 1) diff --git a/arai60/21-29_Tree_BT_BST/29_105_Construct Binary Tree from Preorder and Inorder Traversal/level_4.py b/arai60/21-29_Tree_BT_BST/29_105_Construct Binary Tree from Preorder and Inorder Traversal/level_4.py new file mode 100644 index 0000000..84cf76d --- /dev/null +++ b/arai60/21-29_Tree_BT_BST/29_105_Construct Binary Tree from Preorder and Inorder Traversal/level_4.py @@ -0,0 +1,24 @@ +# [inorder_left, inorder_right) 右側を開区間に修正 +class Solution: + def buildTree( + self, preorder: List[int], inorder: List[int] + ) -> Optional[TreeNode]: + inorder_index_map = {} + for i, val in enumerate(inorder): + inorder_index_map[val] = i + + current_preorder_index = 0 + + def array_to_tree(inorder_left, inorder_right): + nonlocal current_preorder_index + if inorder_left >= inorder_right: + return None + val = preorder[current_preorder_index] + node = TreeNode(val) + inorder_index = inorder_index_map[val] + current_preorder_index += 1 + node.left = array_to_tree(inorder_left, inorder_index) + node.right = array_to_tree(inorder_index + 1, inorder_right) + return node + + return array_to_tree(0, len(inorder))