0

私の BST には pTree というルートがあります。それは次のように宣言されています。

KnightTree* tree;

ここで、ルート (この場合は「ツリー」) を指し、pTree=pTree->pLeftChild; を使用してもイベントを変更しない新しいポインターを持つ関数を作成する必要があります。または pTree=pTree->pRightChild; 以下の関数を呼び出す前に、次のように宣言します。

KnightTree* treeroot=tree;

次に、関数を呼び出します。

ReadNLR(tree,treeroot);

そして、関数は次のようになります。

void ReadNLR(KnightTree*&tree,KnightTree* treeroot)
{
    if(tree !=NULL)
    {
        cout<<tree->key<<" is at the depth of "<<NodeDepth(treeroot,tree)<<endl;
        cout<<treeroot->key<<endl;
        ReadNLR(tree->pLeftChild,treeroot);
        ReadNLR(tree->pRightChild,treeroot);
    }
}

私の考えは、NLR を読み取らせ、読み取ったすべてのノードがその深さを出力することです。しかし、ここで私が抱えている問題は、ツリールートがツリーのコピーと同じであり、それらが同じであるため、深さが常に 1 であることです (ノードからルートまでの距離に 1 を加えた値として)。ツリーが変更されても変更されない最初のツリー ルートからツリールートを宣言するにはどうすればよいですか? ありがとう、そして私の英語でごめんなさい!

4

1 に答える 1

0

一見すると、ツリー引数がポインターへの参照である理由がないことを除いて、コードは適切に見えます。私の推測では、 に何か問題があると思いNodeDepthます。レベルを再計算するのではなく、進行中にレベルを追跡することをお勧めします。ツリーの深さ優先スイープを行う関数は、次のようになります。

void ReadNLR(KnightTree* tree, int level)
{
    if (tree == NULL)
        return;

    cout << tree->key << " is at the depth of " << level;
    ReadNLR(tree->pLeftChild, level + 1);
    ReadNLR(tree->pRightChild, level + 1);
}

およびを引数として呼び出しReadNLRて、印刷プロセスを開始します。root0

キューを使用してレベルごとにツリーを印刷することもできます。まだサポートが必要な場合は、すぐに投稿します。

于 2012-12-04T14:44:23.300 に答える