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