特定の走査方法 (インオーダー、ポストオーダー、またはプリオーダー) からバイナリ ツリーを見つけるにはどうすればよいですか?
4 に答える
1つのトラバーサル(インオーダー、プレオーダー、またはポストオーダー)だけではこれを行うことはできません。
ツリーのインオーダーおよびプレオーダートラバーサルが指定されている場合は、次のように実行できます。
- 事前注文の最初の要素はツリーのルートになります。(Aだとしましょう)
- ルートを順番に並べるので、ルートの左側にあるすべてのノードは左側のサブツリーの順番になり、右側のノードは右側のサブツリーの順番になります。ルートの左側にあるノードの数を計算します。たとえばLです。
- 2番目のLノードからのポストオーダーでは、左側のサブツリーのプレオーダーになり、その後、右側のサブツリーのプレオーダーになります。
そこで、ルート要素を見つけて、Inorder inを左サブツリーのInorder、右サブツリーのInorderに、Preorderを左サブツリーのpreorderと右サブツリーのpreorderに分割しました。したがって、ノードが1つだけ残るまで、再帰によってこれを行うことができます。
同様に、ルートがポストオーダーの最後の要素となるインオーダーとポストオーダーに対しても実行できます。
inorder、post-order、pre-order ツリー トラバーサルに関するウィキペディアの記事は次のとおりです。
http://en.wikipedia.org/wiki/Tree_traversal。
探しているツリーは、検索語に一致するノードから始まります。
(わかりました。修正された質問をここに置くことにしたので、私の回答もここに投稿してください)
二分木のポストオーダートラバーサルとインオーダートラバーサルを以下に示しますが、これらのトラバーサルから一意の二分木を取得することは可能ですか?
可能です。
ポストオーダートラバーサル(左-右-ルート)では、ツリー全体のルートノードが常に最後になります(あなたの場合はAです)。インオーダートラバーサル(左-ルート-右)では、ルートの前のノードは左側のサブツリーに属し、ルートの後のノードは右側のサブツリーに属します。すでにルートを決定しているので、左側のサブツリーと右側のサブツリーのノードを決定できます。
それを決定すると、ポストオーダーリストで左右のサブツリーを分離することができます。これで、左右のサブツリーとルートノードを決定しました。
postorder: left|right|root
inorder : left|root|right
ここで、左右のサブツリーを再帰的に作成する必要があります。フィン。
トラバーサルの結果を使用して元のツリーを復元したい場合は、悪いニュースがあります。明確な解決策はありません。同じトラバーサル結果を生成できるツリーがいくつかあります。
たとえば、次のツリーを順番にトラバーサルすると、同じ結果が得られます。1, 2, 3
2 3 1
/ \ / \
1 3 2 2
/ \
1 3