すべてのリーフにL
とマークされ、その他にN
とマークされた特別なタイプのツリーがあります。すべてのノードは0または最大で2つのノードを持つことができます。木の先行走査が行われます。予約注文トラバーサルが指定されたコンストラクトツリー
このトラバーサルからツリーを構築するアルゴリズムを指定します。
すべてのリーフにL
とマークされ、その他にN
とマークされた特別なタイプのツリーがあります。すべてのノードは0または最大で2つのノードを持つことができます。木の先行走査が行われます。予約注文トラバーサルが指定されたコンストラクトツリー
このトラバーサルからツリーを構築するアルゴリズムを指定します。
これは先行順走査アルゴリズムです:
Preorder(T)
if (T is not null)
print T.label
Preorder(T.left)
Preorder(T.right)
はのはNNLLNL
の入力のためのアルゴリズムを見つけてみましょう。
明らかに、ルートのラベルが最初に印刷されます。だからあなたは根がラベルN
を持っていることを知っています。アルゴリズムは左のサブツリーで繰り返されます。これはまた、入力に応じてN
です。その左のサブツリーであるL
に再帰します。あなたは葉に達しているので、今戻ってきなければなりません。入力の次の位置もL
であるため、現在のノードにはL
というラベルの付いた右の子があります。一度バックトラックしてください。現在のノードの子をすべて追加したため(最大2子)、もう一度バックトラックしてください。今、あなたは再び根源にいます。あなたはすでに左に行ったので、右に行かなければなりません。入力によると、これはN
です。したがって、根の右の子はN
です。その左の子はL
になります。これはあなたのツリーです:
N
/ \
N N
/\ /
L L L
解決方法は必ずしも一意ではありませんが、これにより解決策が得られることに注意してください。
擬似コード:nullのノードとの
k = 0
input = ... get preorder traversal vector from user ...
Reconstruct(T)
if input[k] == N
T = new node with label N
k = k + 1
Reconstruct(T.left)
Reconstruct(T.right)
else
T = new node with label L
T.left = T.right = null
k = k + 1
コール。
フォローアップの質問:別個のノードラベルを含むバイナリツリーのプリオーダとインオーダトラバーサルの両方が与えられている場合、どのようにしてツリーを一意に再構築できますか?
誰かがあなたの疑似コードに関する質問をしました:http://stackoverflow.com/questions/5890617/need-help-deciphering-pseudocode/5890687 – Puddingfox
入力と出力のサンプルを提供できますか?どのような形式で両方が期待されていますか? –
投稿する前に宿題を少なくとも言い換えるのが最も良いと考えられます。あなたが試したことや、どこに立ち退かったのかについて私たちに少しだけ伝えることは、あまりにも助けになります。これは質問と回答の場所で、「自分のコードを書く」だけではありません。 –
@ジェリーどのように漠然とした記述か分かりますが、それはおそらく言い換えればわかります:) –