2012-09-23 83 views
0

在以下代碼片斷中,p是二叉搜索樹中的一個節點,如果p的左側子元素不爲空我想將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]; 
} 

該怎麼辦?

回答

1

您可以保存一個指向父節點螞蟻然後使用該參考更改

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

這是一種解決方法,但我們必須處理p.parent不存在的情況,這會使邏輯有點奇怪。 – outlaw

1

傳遞引用並更改它對Java沒有任何影響,只會更改新的本地引用。
儘管你的其他原因,我建議你去你的最後一個方法。

解決它的另一種方法是傳入p的父節點,並更改該對象中的引用。

+0

我不想用姑娘的做法,因爲這將使代碼非常混亂這麼多的功能被實現時,遞歸。 – outlaw

2

你可以使用一個簡單的包裝:

class Wrapper<T> { 
    public T value; 
} 

void remove(Wrapper<BSTNode> p) 
{ 
    if(p.value.ch[0] == null) 
     p.value = p.value.ch[0]; 
} 
+0

好主意,但是如果我們有很多這類操作,這會不會降低性能? – outlaw

+0

@outlaw:不是,因爲它們都是引用。不要將引用傳遞給'BSTNode',而是將其傳遞給'Wrapper'。相同的大小,涉及相同的操作。 – Tudor

+0

但是,每次我們想要傳遞BSTNode的引用時,我們都必須新建一個包裝器並將值設置爲p,在遞歸函數中可能會有很多這樣的分配。 – outlaw

1

@outlaw,正如你可能知道,Java不支持指針。我對你的要求不太瞭解,但我多次遇到過這種情況。通常我所做的是:而不是轉讓(p = p.ch[0])傳輸屬性p.ch[0] to p

相關問題