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] 并在每次调用删除后设置 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

传递引用并更改它在 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 回答
1

您可以保存指向节点父蚂蚁的指针,然后使用该引用更改它

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