0

例えば

木:

    A
A1     A2

xmlにシリアル化します:

<A> <A1> </A1> <A2> </A2> </A>

ルートファーストトラバーサル(プレオーダー)またはルートラストトラバーサル(ポストオーダー)のいずれかでは、これを達成するのに十分ではないようです。

これを行うための良い方法は何ですか?

4

1 に答える 1

1

答えは主に、「良い」をどのように定義するかに依存します。

事前注文も事後注文も本当に良いものではありません。厳密に適用する場合、子が処理される前/後にルートが完全に処理される必要があります。この解釈では、どちらもメモリ内に文字列を作成する必要があります。例:(postorder):

function process(item)
{
    text=""
    foreach(child in children)
        text=text+process(child)
    return startTag(item)+text+endTag(item)
}

より良いソリューションはストリーミング可能です:

function process(item,stream)
{
    startTag(item,stream)
    foreach(child in children)
        process(child,stream)
    write endTag(item,stream)
}

ここで、startTagとendTagは文字列を返しませんが、その部分をできるだけ早くストリームに書き込みます。

于 2012-11-01T01:42:14.720 に答える