2017-03-31 14 views
0
public void removeNode(int data) { 
    deleteNode(root, data); 
} 

public Node deleteNode(Node focus, int data) { 
    if(focus == null) { 
     System.out.println("Tree empty"); 
     return null; 
    } 
    else if(data < focus.data) { 
     deleteNode(focus.leftchild, data); 
    } 
    else if(data > focus.data) { 
     deleteNode(focus.rightchild, data); 
    } 
    else { 
     // No child 
     if(focus.leftchild == null && focus.rightchild == null) { 
      focus = null; 
     } 
     // one child 
     else if(focus.leftchild == null) { 
      focus = focus.rightchild; 
      System.out.println("here"); 
     } 
     else if(focus.rightchild == null) { 
      focus = focus.leftchild; 
     } 
     // 2 children 
     else { 
      Node temp = findMin(focus.rightchild); 
      focus.data = temp.data; 
      deleteNode(focus.rightchild, temp.data); 
     } 
    } 
    return focus; 
} 

public Node findMin(Node focus) { 
    while(focus.leftchild != null) { 
     focus = focus.leftchild; 
    } 
    return focus; 
} 

バイナリ検索ツリーでノードを削除するために上記のコードを記述しました。しかし、何らかの理由ですべてのノードを印刷するためにpreordertraversal関数を実行すると、ノードが削除されていないことがわかります。誰かがなぜノードが削除されていないのか教えてください。その機能は正しいと思われる。バイナリツリー削除ノード機能が動作しません。

+1

'focus = null'または' focus = focus.rightchild'はノード 'focus'を削除しません。この関数にのみ存在する変数 'focus'を別のノード(または' null')にするだけです。代わりに、ノードの親変数**の変数を別の値に設定する必要があります。 –

+0

よろしく!それを試みます。ありがとうございました! –

答えて

0

私はそれを考え出しました。問題は、私が正しい方法で木を横断していないということでした。また、私は2人の子供がいるという条件で間違いを犯しました。私は右の焦点を設定していませんでした。右手。ここでは更新されたコードです

public Node deleteNode(Node focus, int data) { 
    if(focus == null) { 
     System.out.println("Tree empty"); 
     return null; 
    } 
    else if(data < focus.data) { 
     focus.leftchild = deleteNode(focus.leftchild, data); 
    } 
    else if(data > focus.data) { 
     focus.rightchild = deleteNode(focus.rightchild, data); 
    } 
    else { 
     // No child 
     if(focus.leftchild == null && focus.rightchild == null) { 
      focus = null; 
     } 
     // one child 
     else if(focus.leftchild == null) { 
      focus = focus.rightchild; 
      System.out.println("here"); 
     } 
     else if(focus.rightchild == null) { 
      focus = focus.leftchild; 
     } 
     // 2 children 
     else { 
      Node temp = findMin(focus.rightchild); 
      focus.data = temp.data; 
      focus.rightchild = deleteNode(focus.rightchild, temp.data); 
     } 
    } 
    return focus; 
} 
関連する問題