From ddcfc7b2cdb2977391086f6a0bfdc45dd26bf0fb Mon Sep 17 00:00:00 2001 From: shining-ai Date: Wed, 20 Mar 2024 07:14:36 +0000 Subject: [PATCH 1/3] =?UTF-8?q?=E3=80=90Arai60=E3=80=9129=E5=95=8F?= =?UTF-8?q?=E7=9B=AE=20105.=20Construct=20Binary=20Tree=20from=20Preorder?= =?UTF-8?q?=20and=20Inorder=20Traversal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../level_1.py | 21 ++++++++++++++++ .../level_2.py | 24 +++++++++++++++++++ .../level_3.py | 23 ++++++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 arai60/21-29_Tree_BT_BST/29_105_Construct Binary Tree from Preorder and Inorder Traversal/level_1.py create mode 100644 arai60/21-29_Tree_BT_BST/29_105_Construct Binary Tree from Preorder and Inorder Traversal/level_2.py create mode 100644 arai60/21-29_Tree_BT_BST/29_105_Construct Binary Tree from Preorder and Inorder Traversal/level_3.py 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..f1c8ce5 --- /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(splied_inorder): + nonlocal current_preorder_index + if current_preorder_index >= len(preorder): + return None + val = preorder[current_preorder_index] + if not val in splied_inorder: + return None + current_preorder_index += 1 + node = TreeNode(val) + inorder_index = splied_inorder.index(val) + node.left = array_to_tree(splied_inorder[:inorder_index]) + node.right = array_to_tree(splied_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) From 2a5e2a84119c4f2dcdaae34721e8028e26872c28 Mon Sep 17 00:00:00 2001 From: shining-ai Date: Wed, 20 Mar 2024 12:32:20 +0000 Subject: [PATCH 2/3] =?UTF-8?q?=E5=8F=B3=E5=81=B4=E9=96=8B=E5=8C=BA?= =?UTF-8?q?=E9=96=93=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../level_4.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 arai60/21-29_Tree_BT_BST/29_105_Construct Binary Tree from Preorder and Inorder Traversal/level_4.py 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)) From fecbaaa8893f7bf5656e82f5e8d07a8f86c6da74 Mon Sep 17 00:00:00 2001 From: shining-ai Date: Wed, 20 Mar 2024 12:38:13 +0000 Subject: [PATCH 3/3] =?UTF-8?q?split=E3=81=AE=E8=AA=A4=E6=A4=8D=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../level_1.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 index f1c8ce5..40ab3c8 100644 --- 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 @@ -4,18 +4,18 @@ def buildTree( ) -> Optional[TreeNode]: current_preorder_index = 0 - def array_to_tree(splied_inorder): + 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 splied_inorder: + if not val in split_inorder: return None current_preorder_index += 1 node = TreeNode(val) - inorder_index = splied_inorder.index(val) - node.left = array_to_tree(splied_inorder[:inorder_index]) - node.right = array_to_tree(splied_inorder[inorder_index + 1 :]) + 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)