順序付け前、順序付け、順序付けのどの組み合わせがユニークですか?


28

私たちは、予約注文を知っています、

post L(x)     => [x]
post N(x,l,r) => (post l) ++ (post r) ++ [x]

先行予約

pre L(x)     => [x]
pre N(x,l,r) => [x] ++ (pre l) ++ (pre r)

順序通りのトラバーサル応答。順次化。

in L(x)     => [x]
in N(x,l,r) => (in l) ++ [x] ++ (in r)

ペアごとに異なるキー/ラベルを想定していても、どちらも特定のツリーを一意に記述していないことは簡単にわかります。

そのために3つのどの組み合わせを使用できますか。

肯定的な答えには、ツリーを再構成するための(効率的な)アルゴリズムと、それが正しい理由の証明(アイデア)が含まれている必要があります。負の答えは、反例、つまり、同じ表現を持つ異なるツリーを提供する必要があります。

回答:


16

まず、すべての要素が異なると仮定します。要素を持つツリーの形を伝えることはありません[3,3,3,3,3]。もちろん、重複した要素を持ついくつかのツリーを再構築することは可能です。十分な条件が存在するかどうかはわかりません。

否定的な結果を続けると、事前順序付けと事後順序付けのみからバイナリツリーを完全に再構築することはできません。[1,2]プレオーダー、[2,1]ポストオーダーは1ルートにある必要2がありますが、左の子でも右の子でもかまいません。このあいまいさを気にしない場合は、次のアルゴリズムを使用してツリーを再構築できます。

  • ましょうプリオーダートラバースすること[ Y 、N... Y 1 ]帰りがけ順です。x 1 = y 1である必要があり、これがツリーのルートです。[x1,,xn][yn,,y1]x1=y1
  • はルートの一番左の子で、 y 2は一番右の子です。もし、X 2 = Y 2、ルートノードは単項です。[ x 2x n ]および [ y ny 2 ]を再帰処理して、単一のサブツリーを構築します。x2y2x2=y2[x2,,xn][yn,,y2]
  • それ以外の場合、jx 2 = y iおよびy 2 = x jのようなインデックスにします。[ x 2x j 1 ]は左サブツリーの事前順走査であり、[ x jx n ]右サブツリーの順走査であり、同様に後順走査です。左のサブツリーはj 2 = n i +ijx2=yiy2=xj[x2,,xj1][xj,,xn]要素で、右のサブツリーには i 2 = n j + 1個の要素があります。サブツリーごとに1回再帰します。 ところで、このメソッドは、任意の分岐を持つツリーに一般化します。任意の分岐では、左のサブツリーの範囲を見つけて、両方のリストからその j 2個の要素を切り取り、それから繰り返して左から2番目のサブツリーを切り取ります。j2=ni+1i2=nj+1
    j2

前述のように、実行時間はΘ n 2最悪の場合です(子が2人の場合、各リストを直線的に検索します)。それをO nO(n2)Θ(n2)リストを前処理して nを構築する場合O(nlg(n))要素値から入力リストの位置への有限マップ構造。また、配列または有限マップを使用して、インデックスから値に移動します。グローバルインデックスに固執すると、再帰呼び出しがマップ全体を受け取り、何を処理するかを知るための引数として範囲を取ります。nlg(n)

事前順序走査および順序走査([ z 1z n ])を使用すると、次のようにツリーを再構築できます。[x1,,xn][z1,,zn]

  • ルートは、事前注文走査の先頭です。x1
  • ましょうインデックスようにすることのz K = X 1。その場合、[ z 1z k 1 ]は左の子の順序走査であり、[ z k + 1z n ]は右の子の順序走査です。要素の数だけ進むと、[ x 2x k ]は左の子と[ x kkzk=x1[z1,,zk1][zk+1,,zn][x2,,xk]右の子のそれ。再帰的に左および右のサブツリーを構築します。[xk+1,,xn]

繰り返しますが、このアルゴリズムはとおりO n 2であり、O nO(n2)リストが値から位置への有限マップに前処理される場合。O(nlg(n))

ポストオーダーとインオーダーはもちろん対称です。


「[1,2] preorder、[1,2] postorderはルートに1が必要ですが、2は左の子でも右の子でも構いません。」ツリーは、[2,1]ではなく[2,1]になります。また、プレオーダーとポストオーダーの両方が指定されている場合、ツリーを再構築できない、または、一方のみが指定されている場合、ツリーを再構築できないという意味ですか?
CEGRD

@CEGRD実際、ポストオーダーはタイプミスでした。この例は、この場合ツリーを完全に再構築できないことを示しています2。左の子か右の子かはわかりません。これは、再構成アルゴリズムの「単一サブツリー」の場合に対応します。
ジル 'SO-悪であるのをやめる

バイナリ検索ツリーであることがわかっている場合、これはどのように変わりますか?あなたの例([1,2]事前注文、[2,1]事後注文)の単純なケースでは、ルートが1であり、2が正しい子である(2が1より大きいため)と判断できます... 右?
フェルサー14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.