まず、すべての要素が異なると仮定します。要素を持つツリーの形を伝えることはありません[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 2、… 、x n ]および [ y n、… 、y 2 ]を再帰処理して、単一のサブツリーを構築します。x2y2x2=y2[x2,…,xn][yn,…,y2]
- それ以外の場合、とjをx 2 = y iおよびy 2 = x jのようなインデックスにします。[ x 2、… 、x j − 1 ]は左サブツリーの事前順走査であり、[ x j、… 、x n ]右サブツリーの順走査であり、同様に後順走査です。左のサブツリーはj − 2 = n − i +ijx2=yiy2=xj[x2,…,xj−1][xj,…,xn]要素で、右のサブツリーには i − 2 = n − j + 1個の要素があります。サブツリーごとに1回再帰します。
ところで、このメソッドは、任意の分岐を持つツリーに一般化します。任意の分岐では、左のサブツリーの範囲を見つけて、両方のリストからその j − 2個の要素を切り取り、それから繰り返して左から2番目のサブツリーを切り取ります。j−2=n−i+1i−2=n−j+1
j−2
前述のように、実行時間は、Θ (n 2)最悪の場合です(子が2人の場合、各リストを直線的に検索します)。それをO (nO(n2)Θ(n2)リストを前処理して nを構築する場合O(nlg(n))要素値から入力リストの位置への有限マップ構造。また、配列または有限マップを使用して、インデックスから値に移動します。グローバルインデックスに固執すると、再帰呼び出しがマップ全体を受け取り、何を処理するかを知るための引数として範囲を取ります。nlg(n)
事前順序走査および順序走査([ z 1、… 、z n ])を使用すると、次のようにツリーを再構築できます。[x1,…,xn][z1,…,zn]
- ルートは、事前注文走査の先頭です。x1
- ましょうインデックスようにすることのz K = X 1。その場合、[ z 1、… 、z k − 1 ]は左の子の順序走査であり、[ z k + 1、… 、z n ]は右の子の順序走査です。要素の数だけ進むと、[ x 2、… 、x k ]は左の子と[ x kkzk=x1[z1,…,zk−1][zk+1,…,zn][x2,…,xk]右の子のそれ。再帰的に左および右のサブツリーを構築します。[xk+1,…,xn]
繰り返しますが、このアルゴリズムはとおりO (n 2)であり、O (nO(n2)リストが値から位置への有限マップに前処理される場合。O(nlg(n))
ポストオーダーとインオーダーはもちろん対称です。