2014-01-15 69 views
0

我試圖實現刪除BST中的節點。 這裏是我的部分代碼。python如何通過引用傳遞?

def delete(node,key): 
#Locate that node with value k 
    cNode=node 
    target=None 
    while cNode: 
     if cNode.value==key: 
      target=cNode 
      break 
     elif node.value>key: 
      cNode=cNode.lChild 
     elif node.value<key: 
      cNode=cNode.rChild 
    target=None 
    return node 

當我試圖用上面的方法刪除一個葉節點。我失敗了。當方法返回時,它對原始BST沒有任何影響。那麼這個代碼有什麼問題?我認爲它應該有一些關於python如何通過引用傳遞參數?但我現在很困惑。 非常感謝提前。

+0

這裏沒有任何代碼可以刪除樹中的任何內容。您可能需要切斷父母和子女之間的鏈接 – nos

+0

但我將目標節點(即葉節點)設置爲None,它也應該更改原始樹,對不對? – lexie

+1

Python已經通過引用_values_;它從不默默地複製任何東西。但它沒有通過引用傳遞_variables_,因爲這樣做沒有意義; Python變量不是內存位置,它們只是某些名稱空間中的名稱。 – abarnert

回答

7

target = None重新綁定可變target爲一個新值,None。無論什麼target之前都不會改變。

你必須追蹤父節點並設置它的lChildrChild屬性None代替。

def delete(node,key): 
    cNode = node 
    target = parent = None 
    while cNode: 
     if cNode.value == key: 
      target = cNode 
      break 
     elif cNode.value > key: 
      parent, cNode = cNode, cNode.lChild 
     elif cNode.value < key: 
      parent, cNode = cNode, cNode.rChild 

    if target: 
     if parent: 
      if parent.lChild is target: 
       parent.lChild = None 
      else: 
       parent.rChild = None 
     else: 
      # target is top-level node; perhaps return None in that case? 
    return node 
+0

謝謝Martjin,我看到了我的問題。 – lexie

+0

是的,我會和看來我只能在2分鐘內做到這一點 – lexie