まず、問題の背景を理解しましょう。二分木は、各ノードが最大で2つの子ノードを持つデータ構造です。先行順序とは、ルートノードを最初に訪れ、その後に左部分木を訪れ、最後に右部分木を訪れる順序です。一方、中間順序とは、左部分木を訪れた後にルートノードを訪れ、その後に右部分木を訪れる順序です。
- ルートノードを先行順序の最初の要素として識別します。
- 中間順序でのルートノードの位置を見つけます。この位置によって、左部分木と右部分木の要素を識別できます。
- 先行順序と中間順序のそれぞれについて、左部分木と右部分木の遍歴を取得します。
- 左部分木と右部分木に対して再帰的に同じ手順を繰り返します。
- 再帰を終了する条件は、先行順序または中間順序の遍歴が空である場合です。
このアプローチに基づいて、以下に示すようなPythonのコード例を提供します。
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def buildTree(preorder, inorder):
if not preorder or not inorder:
return None
root_val = preorder[0]
root = TreeNode(root_val)
root_index = inorder.index(root_val)
left_inorder = inorder[:root_index]
right_inorder = inorder[root_index + 1:]
left_preorder = preorder[1:1 + len(left_inorder)]
right_preorder = preorder[1 + len(left_inorder):]
root.left = buildTree(left_preorder, left_inorder)
root.right = buildTree(right_preorder, right_inorder)
return root
上記のコードでは、TreeNode
クラスを定義し、buildTree
関数を使用して二分木を再構築します。再帰的なアプローチを使用しており、与えられた先行順序と中間順序の遍歴から元の二分木を再帰的に構築します。
この投稿を通じて、LeetCodeの問題105についての理解を深め、二分木の再構築に関するアルゴリズムとコードの実装方法を学ぶことができるでしょう。