0

CLRS の二分探索木の章で、ノードを親要素に適切な変更を加えたuノードに置き換える移植関数に遭遇しました。v移植機能用に書いたコードは次のとおりです。

void transplant(Node* root, Node* u, Node* v)
{
    if(u->parent == NULL)
        root = v;
    else if(u == u->parent->left)
        u->parent->left = v;
    else
        u->parent->right = v;
    if(v != NULL)
        v->parent = u->parent;
}

これがどのように機能するかを理解していないということではなく、なぜこれが機能するのかということです。関数呼び出しを行うとき、基本的にポインターのコピーを関数に送信していますrootuv?したがって、関数で行われた変更は、実際に元のルートを変更するか、ポインター型へのポインターを使用しない限り、実際にはルートに反映されるべきではありません。root をグローバル変数として定義しましたが、何か変更はありますか?

4

1 に答える 1

0

u->parentが の場合、関数は機能しませんNULL。その場合、ローカル変数のみrootが に設定されv、関数の外部からアクセスできるものは何も変更されません。

の場合u->parent != NULLu->parent->leftおよびは が指すu->parent->rightのメンバーであり、それらは上書きされるため、変更は に表示されます。Nodeu->parentmain

于 2012-09-22T14:14:39.303 に答える