在下面的代码片段中,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];
}
怎么做?
答案 0 :(得分:2)
您可以使用简单的包装器:
class Wrapper<T> {
public T value;
}
void remove(Wrapper<BSTNode> p)
{
if(p.value.ch[0] == null)
p.value = p.value.ch[0];
}
答案 1 :(得分:1)
传递引用并更改它只会对Java没有任何影响,您只会更改新的本地引用 尽管你有其他原因,我建议你选择最后一种方法。
另一种解决方法是传入p
的父节点,并更改该对象中的引用。
答案 2 :(得分:1)
@outlaw,您可能知道,Java不支持指针。我对你的要求知之甚少,但我多次遇到过这种情况。通常我所做的是:而不是赋值p = p.ch[0]
)转移p.ch[0] to p
的属性。
答案 3 :(得分:1)
您可以保存指向父节点的指针,然后使用该引用更改它
void remove(BSTNode p)
{
if(p.ch[0]==null){
p.parent.ch[0] = p.ch[0];
}