2017-03-09 61 views
1

我正在使用二叉搜索樹進行類分配。我試圖通過將新節點分配給遞歸方法參數來替換具有不同節點的節點。參數分配不能按預期工作

node = minNode(node.right);未按預期工作。它會修改參數SearchTreeNode<E> node,但此更改不會傳播到this.overallRoot。例如,如果樹的根是5,並且我們刪除5,並且替換爲7,this.overallRoot仍然是5,即使參數節點已更改爲7.請參見下面的截圖。

任何想法我做錯了什麼?

public void remove(E data) { 
    if (this.overallRoot != null) { 
     this.removeData(this.overallRoot, data); 
    } 
} 

private void removeData(SearchTreeNode<E> node, E data) { 
    if (node.data == data) { 
     if (node.left == null && node.right == null) { 
      node = null; 
     } else if (node.left != null && node.right != null) { 
      node = minNode(node.right); 
     } else if (node.right == null) { 
      node = node.left; 
     } else if (node.left == null) { 
      node = node.right; 
     } 
    } else if (data.compareTo(node.data) < 0) { 
     this.removeData(node.left, data); 
    } else if (data.compareTo(node.data) > 0) { 
     this.removeData(node.right, data); 
    } 
} 

private SearchTreeNode<E> minNode(SearchTreeNode<E> node) { 
    if (node.left == null) { 
     return node; 
    } 
    return minNode(node.left); 
} 

Debugging code overallRoot with data 5 node with data 7

+1

請張貼您的代碼。 – shmosel

+0

Stackoverflow給我錯誤,我試圖添加屏幕截圖以及調試更多信息 –

回答

1

你的診斷是完全正確:修改node沒有任何好處,因爲node是一個局部變量。對參數的修改不會傳播給調用者。

可以修改node.leftnode.right,雖然。這些變化將是可見的。你需要重構你的代碼來利用它。這不是一個快速修復。

或者,您可以將值返回給removeData的調用方,並讓調用方更改相應的變量。那也需要一些想法來確定每個removeData的分支返回什麼。調用它看起來像:

node.left = this.removeData(node.left, data);