C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で中間順・先行順トラバーサルから二分木を構築する方法

はじめに

二分木の中間順トラバーサル(Inorder)と先行順トラバーサル(Preorder)の結果が与えられたとき、それらから元の二分木を復元して構築することができます。本記事では、その具体的な考え方と手順をわかりやすく解説します。

中間順トラバーサル(Inorder traversal)とは

中間順トラバーサルでは、「左部分木 → ノード自身 → 右部分木」の順でノードを訪問します。

中間順トラバーサルの手順(root を起点とする場合)

  • root が指すノードの左部分木をたどる(inorder(root→left) を再帰呼び出し)
  • ノード自身(ルート)を訪問する
  • root が指すノードの右部分木をたどる(inorder(root→right) を再帰呼び出し)

先行順トラバーサル(Preorder traversal)とは

先行順トラバーサルでは、「ノード自身 → 左部分木 → 右部分木」の順でノードを訪問します。

先行順トラバーサルの手順(root を起点とする場合)

  • ノード自身(ルート)を訪問する
  • root が指すノードの左部分木をたどる(preorder(root→left) を再帰呼び出し)
  • root が指すノードの右部分木をたどる(preorder(root→right) を再帰呼び出し)

例:対象となる二分木

以下の二分木に対する中間順トラバーサルと先行順トラバーサルの結果は次のとおりです。

C++で中間順・先行順トラバーサルから二分木を構築する方法

中間順(Inorder)

2-3-4-5-6-8-10

先行順(Preorder)

5-3-2-4-8-6-10

トラバーサル結果から木を構築する手順

それでは、上記の中間順・先行順トラバーサルの結果から、元の木を実際に組み立てていきましょう。

  • 先行順トラバーサルは必ず最初に根(ルート)ノードを訪問するため、系列の先頭の値が常に木全体の根となります。この例では、先頭の「5」が木の根です。

先行順(Preorder)

5 -3-2-4-8-6-10
  • 中間順トラバーサルには「あるノードより前にその左部分木が現れ、後にその右部分木が現れる」という性質があります。したがって、中間順の並びにおいて「5」より左側にある値はすべて左部分木に、「5」より右側にある値はすべて右部分木に属します。

中間順(Inorder)

2-3-4 ← 5 → 6-8-10

C++で中間順・先行順トラバーサルから二分木を構築する方法

  • 次に、左部分木に対して同じ操作を繰り返します。

左部分木の先行順トラバーサルは「3-2-4」なので、根は「3」となります。

中間順トラバーサルはさらに「2 ← 3 → 4」と分割されます。

C++で中間順・先行順トラバーサルから二分木を構築する方法

  • 同様に、右部分木に対しても同じ操作を行います。

右部分木の先行順トラバーサルは「8-6-10」なので、根は「8」となります。

中間順トラバーサルはさらに「6 ← 8 → 10」と分割されます。

C++で中間順・先行順トラバーサルから二分木を構築する方法

まとめ

このように、先行順トラバーサルで根を特定し、中間順トラバーサルで左右の部分木を切り分ける、という手順を再帰的に繰り返すことで、与えられた先行順・中間順トラバーサルの結果から元の二分木を正確に構築することができます。

  1. Pythonで中順走査(インオーダー)と後順走査(ポストオーダー)から二分木を構築する方法

    はじめに 二分木の中順走査(インオーダー)と後順走査(ポストオーダー)の結果が分かっていれば、この2つの列を組み合わせることで元の二分木を一意に復元できます。 例として、後順走査の列が [9,15,7,20,3]、中順走査の列が [9,3,15,20,7] である場合、構築される二分木は次の構造になります。 3 / \ 9 20 / \ 15 7 アルゴリズムの手順 再帰的に木を組み立てていきます。ここではメソッド名を buildTree とし、基本の流れは以下のとおりです。 根の決定: 後順走査の「最後の要素」が必ず根(ル

  2. Pythonで前順走査と中間順走査の結果から二分木を構築する方法

    二分木の中間順走査(inorder)と前順走査(preorder)の結果が与えられたとき、それらをもとに元の二分木を復元することを考えます。例えば、前順走査の結果が [3,9,20,15,7]、中間順走査の結果が [9,3,15,20,7] である場合、構築される二分木は次のようになります。アルゴリズムの考え方この問題は再帰を使うことで簡潔に解けます。鍵となるのは以下の2つの性質です。前順走査の最初の要素は必ず根(ルート)である中間順走査において、ルートより左側の要素は左部分木、右側の要素は右部分木に属する処理の手順buildTree メソッドに前順走査リスト(preorder)と中間順走査リ