0

これは、私の以前の質問の 1 つに関連しています。XMLファイルからツリーを構築しようとしています。xml ファイルを調べて、データからオブジェクトを作成し、ツリー オブジェクトを構築できるように、オブジェクトのベクトルを preorder と inorder で作成する予定です。私が使用している xml ファイルは、これよりもはるかに高密度 (約 23 レベル程度) ですが、レイアウトの例を次に示します。

<?xml version="1.0" encoding="utf-8"?>
<MyJournal>
    <species>
        <name>Sea Creature</name>
        <species>
            <name>Fish</name>
            <species>
                <name>swordfish</name>
            </species>
            <species>
                <name>grouper</name>
            </species>
        </species>
        <species>
            <name>Mammal</name>
            <species>
                <name>dolphin</name>
            </species>
            <species>
                <name>whale</name>
            </species>
        </species>
    </species>
    <species>
        <name>Land animal</name>
        <species>
            <name>Mammal</name>
            <species>
                <name>dog</name>
            </species>
            <species>
                <name>cat</name>
            </species>
        </species>
        <species>
            <name>Bird</name>
            <species>
                <name>blue jay</name>
            </species>
            <species>
                <name>robin</name>
            </species>
        </species>
    </species>
</MyJournal>

私の事前注文と事後注文の方法。ルート ノード「MyJournal」が最初に渡されます。

void preOrder(xml_node<> *species) // add to left node
{
    Node t1 = *new Node();
    xml_node<> * name_node = species->first_node("name");
    //If there is a value for name, set the name of the node to this name
    if(name_node != 0)
    {
        t1.setName(name_node->value());
        cout << t1.getName() << " ";
    }
    //If there is no name node, print the default name which is "ROOT"
    if(name_node == 0)
    {
        cout << t1.getName() << " ";
    }
    for (xml_node<> * child_node = species->first_node("species"); child_node; child_node = child_node->next_sibling())
    {
        loop2(child_node); // add these to right node
    }
}

void postOrder(xml_node<> *species) // add to left node
{
    Node t1 = *new Node();
    for (xml_node<> * child_node = species->first_node("species"); child_node; child_node = child_node->next_sibling())
    {
        loop3(child_node); // add these to right node
    }
    xml_node<> * name_node = species->first_node("name");
    if(name_node != 0)
    {
        t1.setName(name_node->value());
        cout << t1.getName() << " ";
    }
    if(name_node == 0)
    {
        cout << t1.getName() << " ";
    }

}

これまでのところ、ファイルを調べて、前後の順序でオブジェクトを取得することはできますが、関数を再帰的に呼び出すための左または右のポインターがないため、データを順序どおりに取得する方法がわかりません。これについてどうすればよいか、誰かが私にいくつかのガイダンスを教えてもらえますか? この方法でデータを取得し、ツリー構造を正常に構築することは可能ですか? 助けてくれてありがとう!

4

1 に答える 1

1

前、後、および順序内トラバーサルの概念は、バイナリ ツリーにのみ適用されます。つまり、各ノードが最大 2 つの子を持つツリーです。

XML データ (一般に) は、これに従う必要はありません。各ノードは、任意の数の子を持つことができます。

XML ファイルをバイナリ ツリーとして解釈する必要がある場合は、最初の種ノードを「左」として扱い、兄弟 (存在する場合) を「右」として扱います。

この場合、すべての兄弟をループしても意味がないことに注意してください。

于 2013-03-11T12:47:57.403 に答える