2017-03-23 18 views
0
class BinaryNode: 
def __init__(self, value): 
    self.data = value 
    self.left = None 
    self.right = None 

def contains(root, value): 
    if root is None: 
     return False 

    if value == root.data: 
     return True 

    if value < root.data: 
     return contains(root.left, value) 
    else: 
     return contains(root.right, value) 


def insert(root, value): 
    if root is None: 
     root = BinaryNode(value) 
    else: 
     if value > root.data: 
      if root.right is None: 
       root.right = BinaryNode(value) 
      else: 
       return insert(root.right, value) 
     else: 
      if root.left is None: 
       root.left = BinaryNode(value) 
      else: 
       return insert(root.left, value) 

def getMin(root): 
    if root.left is None: 
     return root.data 
    return getMin(root.left) 

def remove(root, value, parent = None): 
    if root is None: 
     return False 
    elif value < root.data and root.left is not None: 
     return remove(root.left, value, root) 
    elif value > root.data and root.right is not None: 
     return remove(root.right, value, root) 
    else: 
     if parent.left is not None and parent.right is None and \ 
      root.left is None and root.right is None: 
       root = None 
       parent.left = root 



def inorder(root): 
    if root is not None: 
     inorder(root.left) 
     print(root.data) 
     inorder(root.right) 


b = BinaryNode(10) 
insert(b, 8) 
insert(b, 11) 

remove(b,11) 

inorder(b) 

私はバイナリ検索ツリーの削除関数を書いていますが、これは正しい実装ロジックです。リーフノードを削除する最も基本的なケースを実装しました。問題は、Pythonに関連している必要がありますか?私は11を削除しようとすると、inorder traversalでそれを印刷します。バイナリ検索ツリーの削除メソッドは何もしません

+0

削除機能の機能を確認するために、1行ずつデバッグしましたか?私は実際に物を取り除くためのコードのほとんどが関数にないと思う。 –

答えて

0

ノードを削除するロジックには、必要な手順がありません。以下のノードを削除するコードを見つけてください:

def remove(root, value, parent): 
    if root is None: 
     return False 
    elif value < root.data and root.left is not None: 
     return remove(root.left, value, root) 
    elif value > root.data and root.right is not None: 
     return remove(root.right, value, root) 
    else: 
     if value == root.data: 
      if root.right is not None: 
       removeRoot = root.right 
       while(removeRoot.left is not None): 
        parRoot = removeRoot 
        removeRoot = removeRoot.left 
       root.data = removeRoot.data 
       parRoot.left = None 
       del removeRoot 
      elif root.left is not None: 
       parent.left = root.left 
       del root 
      else: 
       if parent.right is not None and parent.right.data == root.data: 
        parent.right = None 
       elif parent.left is not None: 
        parent.left = None 
       del root 
関連する問題