0

次のコード スニペットでは、p は二分探索木のノードです。p の左の子が null でない場合、p をその左の子を指すように変更したいのですが、Java は関数が値を返すときに値渡しです。木の構造は変わらない。

void remove(BSTNode p)
{
    if(p.ch[0]==null)
        p=p.ch[0];
}

実際には、次の C++ コードのようなものを実装したいと考えています。

void remove(BSTNode* &p)
{
    if(p->ch[0]==NULL)
        p=p->ch[0];
}

他の理由から、次の方法を使用して p.ch[0] を返し、remove を呼び出すたびに p を設定したくありません。

BSTNode remove(BSTNode p)
{
    if(p.ch[0]==null)
        return p.ch[0];
}

どうすればそれができますか?

4

4 に答える 4

2

シンプルなラッパーを使用できます。

class Wrapper<T> {
    public T value;
}

void remove(Wrapper<BSTNode> p)
{
    if(p.value.ch[0] == null)
        p.value = p.value.ch[0];
}
于 2012-09-23T13:02:45.150 に答える
1

ノードの親 ant へのポインターを保存し、その参照を使用して変更することができます

void remove(BSTNode p)
{
    if(p.ch[0]==null){
    p.parent.ch[0] = p.ch[0];
}
于 2012-09-23T13:06:31.447 に答える
1

参照を渡して変更しても、Java では何の効果もありません。新しいローカル参照のみを変更します。
他の理由にもかかわらず、最後のアプローチを使用することをお勧めします。

これを解決する別の方法は、 の親ノードを渡し、pそのオブジェクトの参照を変更することです。

于 2012-09-23T13:01:25.773 に答える
1

@outlaw、ご存知かもしれませんが、Java はポインターをサポートしていません。あなたの要件についてはよくわかりませんが、このような状況に何度も直面しました。通常、私が行うことは次のとおりです。代入(p = p.ch[0])の代わりに、のプロパティを転送しますp.ch[0] to p

于 2012-09-23T13:03:37.787 に答える