2017-12-11 3 views
0
class Node: 
    def __init__(self,value = None): 
     self.value = value 
     self.left = None 
     self.right = None 

class BinarySearchTree: 
    def __init__(self): 
     self.root = None 

    def insert(self,value): 
     if self.root != None: 
      self._insert(self.root,value) 
     else: 
      self.root = Node(value) 

    def _insert(self,current,value): 
     if value < current.value: 
      if current.left == None: 
       current.left = Node(value) 
      else: 
       self._insert(current.left,value) 

     elif value > current.value: 
      if current.right == None: 
       current.right = Node(value) 
      else: 
       self._insert(current.right,value) 
     else: 
      print("Value already exist in tree.") 


    def delete(self,current,value): 
     if current == None: return current 
     elif value < current.value: current.left = self.delete(current.left,value) 
     elif value > current.value: current.right = self.delete(current.right,value) 
     else: 
      if current.left == None and current.right == None: 
       current = None # case 0 
      elif current.left == None: return current.right # case 1r 
      elif current.right == None: return current.left # case 1l 
      else: # case 2 
       temp = self.min(current.right) 
       current.value = temp 
       self.delete(current.right,temp) 
     return current 

    def min(self,current): 
     if current != None: 
      return self._min(current) 
     else: 
      return None 

    def _min(self,current): 
     if current.left != None: 
      return self._min(current.left) 
     else: 
      return current.value 

if __name__ == '__main__': 
    for i in (12,5,18,3,4,6): 
     tree.insert(i) 
    tree.delete(tree.root,12) 

안녕하세요, 이진 검색 트리의 삭제 기능은 두 자녀가있는 노드에서 작동하지 않으므로 도움이됩니다.이진 검색 트리에 대한 삭제 기능이 파이썬에서 작동하지 않습니다.

이 문제는 삭제 기능의 6 번과 12 번 줄로 인해 발생하며, 여기서 self.delete(current.right,temp) 줄은 current = None # case 0이됩니다. 라인 current = None # case 0은 전류 값을 0으로 변경하지 않습니다. 이것은 매우 혼란 스럽습니다. 어떤 생각이 잘못된거야?

+0

이렇게하면 함수에 전달한 값이 아닌 'current'만 로컬에 설정됩니다. 그게 네가 예상했던 거라고 생각해? – Jeronimo

답변

1

와 삭제 방법에 라인 (12)을 교체 :

current.right = self.delete(current.right, temp) 

이유는 간단하다 : 현재 = 없음 만 로컬 값에 영향을 미치지, 그것은 노드 (12)의 왼쪽 자녀 또는 오른쪽 아이에 영향을 미칠 수 없습니다.

관련 문제