2016-09-09 3 views
3

私は、削除操作以外のPythonでのバイナリ検索ツリーの実装をほぼ完了しました。Pythonでのバイナリ検索ツリーの基本実装での削除操作

これまでのところ、私がこれまでテストした機能のすべてのユースケースで: 1.リーフノードが正しく削除されている二人の子供を持つ 2.ノードが正常に削除され 3.ルート・ノードが正しく

を削除されます

ですが、左の子または右の子のいずれかのノードを削除することはできません。私のEclipse IDEはステートメントの中には効果がない(次の図では黄色で表示されているステートメント)ので、私のiPythonノートブックローカルサーバーでプログラムを試してみましたが、結果は同じようです。

ライン43-57: enter image description here

私はPythonプログラム内で行方不明だということ、それは何ですか?私を助けてください。ここに私のコードは次のとおりです。

prevnode = None 

class Node:  
    def __init__(self,data): 
     self.data = data 
     self.left = None 
     self.right = None 

def insert(node,info): 
    if node.data is None: 
     node.data = info 
    elif info < node.data: 
     if node.left is None: 
      node.left = Node(None) 
     insert(node.left,info) 
    elif info >= node.data: 
     if node.right is None: 
      node.right = Node(None) 
     insert(node.right,info) 

def search(node,info): 
    if node is None: 
     print "Node with the mentioned data is not found" 
    if node.data == info: 
     print "Found the node containing value held by info" 
    elif info < node.data and node.left is not None: 
     search(node.left,info) 
    elif info > node.data and node.right is not None: 
     search(node.right,info) 

def delete(node,info): 
    global prevnode 
    if info == node.data: 
     print "This is the place where info is stored" 
     if node.left is None and node.right is None: 
      if prevnode.left is not None and prevnode.left.data == node.data: 
       prevnode.left = None 
       del node 
      elif prevnode.right is not None and prevnode.right.data == node.data: 
       prevnode.right = None 
       del node 
      return     
     elif node.left is not None and node.right is None: 
      if prevnode.left is not None and prevnode.left.data == node.data: 
       prevnode.left == node.left 
       del node 
      elif prevnode.right is not None and prevnode.right.data == node.data: 
       prevnode.right == node.left 
       del node 
      return 
     elif node.left is None and node.right is not None: 
      if prevnode.left is not None and prevnode.left.data == node.data: 
       prevnode.left == node.right 
       del node 
      elif prevnode.right is not None and prevnode.right.data == node.data: 
       prevnode.right == node.right 
       del node 
      return   
     elif node.left is not None and node.right is not None: 
      node.data = None 
      prevnode = node.right 
      successor = prevnode.left 
      if successor is None: 
       node.data = prevnode.data 
       node.right = prevnode.right 
      elif successor is not None: 
       while successor.left is not None: 
        prevnode = successor 
        successor = prevnode.left 
       if successor.right is None: 
        node.data = successor.data 
        prevnode.left = None 
        del successor 
       elif successor.right is not None: 
        prevnode.left = successor.right 
        node.data = successor.data 
        successor.right = None 
        del successor    
    elif info < node.data: 
     print "We will have to go to the left child of the current node" 
     prevnode = node 
     print "parent of the left child will be prevnode : ",prevnode.data 
     delete(node.left,info) 
    elif info >= node.data: 
     print "We will have to go to the right child of the current node" 
     prevnode = node 
     print "parent of the right child will be prevnode : ",prevnode.data 
     delete(node.right,info) 

def display(node,parent): 
    if node is not None: 
     print "value at this node is ",node.data 
     if parent is None: 
      print "it is the root node" 
     else: 
      print "the parent is ",parent.data 
    if node.left is not None: 
     display(node.left,node) 
    if node.right is not None: 
     display(node.right,node) 
    else: 
     return 

BST = Node(None) 
while True: 
    choice = int(raw_input("Please enter your choice 1.Insert, 2.Search, 3.Delete, 4.Display, 5.Exit")) 
    if choice == 1: 
     num = int(raw_input("Please enter the number you wish to insert")) 
     insert(BST,num) 
    elif choice == 2: 
     num = int(raw_input("Please enter the number you wish to find")) 
     search(BST,num) 
    elif choice == 3: 
     num = int(raw_input("Please enter the number you wish to delete")) 
     delete(BST,num) 
    elif choice == 4: 
     print "Displaying the Tree" 
     display(BST,None) 
    elif choice == 5: 
     break 
    else: 
     print "Please enter the correct input" 

P.S:間違ったくぼみが(私はどれもかかわらず、存在しないかなり確信している)があるだけの場合には、それらを適切に

答えて

2

、単純なタイプミスがありインデントすることができます。 =の代わりに==を使用しています。

ので、代わりにこの:男ああ、それはすべてだった

elif node.left is not None and node.right is None: 
     if prevnode.left is not None and prevnode.left.data == node.data: 
      prevnode.left = node.left # Changed == to = 
      del node 
     elif prevnode.right is not None and prevnode.right.data == node.data: 
      prevnode.right = node.left # Changed == to = 
      del node 
     return 
    elif node.left is None and node.right is not None: 
     if prevnode.left is not None and prevnode.left.data == node.data: 
      prevnode.left = node.right # Changed == to = 
      del node 
     elif prevnode.right is not None and prevnode.right.data == node.data: 
      prevnode.right = node.right # Changed == to = 
      del node 
     return 
+0

elif node.left is not None and node.right is None: if prevnode.left is not None and prevnode.left.data == node.data: prevnode.left == node.left del node elif prevnode.right is not None and prevnode.right.data == node.data: prevnode.right == node.left del node return elif node.left is None and node.right is not None: if prevnode.left is not None and prevnode.left.data == node.data: prevnode.left == node.right del node elif prevnode.right is not None and prevnode.right.data == node.data: prevnode.right == node.right del node return 

あなたはこれをしたいです。それを考えると、代入演算子の代わりに条件演算子を使用しているのはなぜですか?私の悪い、ボビーを指摘してくれてありがとう。 :) –

+0

クールアイスポットがある@bobby – pitaside

関連する問題