2016-05-03 11 views
0

に条件を追加し、私は最終的に、私のBSTの作業とその機能を持って操作は:theTree.remove(key<=75);と他の複数の方法で、私はそのようなことを行う構文が間違っていることを知っていますが、私はそれを行う方法についてオンラインで関連情報を見つけることはできないようです。どんな助言も役に立ちます。には、いくつかのBSTノードの削除

コード:

public class DatosTarea9 { 

    Node root; 
    public void addNode(int key, String name) { 
     Node newNode = new Node(key, name); 

     if(root == null) { 
      root = newNode; 
     } 
     else { 
      Node focusNode = root; 
      Node parent; 
      while(true) { 
       parent = focusNode; 
       if(key < focusNode.key) { 
         focusNode = focusNode.leftChild; 
         if(focusNode == null) { 
          parent.leftChild = newNode; 
          return; 
      } 
     } 
       else { 
        focusNode = focusNode.rightChild; 
        if(focusNode == null) { 
         parent.rightChild = newNode; 
         return; 
        } 
       } 
     } 
    } 
    } 

    public void inOrderTraverseTree(Node focusNode) { 
     if(focusNode != null){ 
      inOrderTraverseTree(focusNode.leftChild); 
      System.out.println(focusNode); 
      inOrderTraverseTree(focusNode.rightChild); 
     } 
    } 

    public boolean remove(int key) { 
     Node focusNode = root; 
     Node parent = root; 

     boolean isItALeftChild = true; 

     while (focusNode.key != key){ 
      parent = focusNode; 
      if(key < focusNode.key){ 
       isItALeftChild = true; 

       focusNode = focusNode.leftChild; 
      } 
      else { 
       isItALeftChild = false; 
       focusNode = focusNode.rightChild; 
      } 
      if(focusNode == null) 
        return false; 
     } 
     if (focusNode.leftChild == null && focusNode.rightChild == null){ 
      if(focusNode == root){ 
       root = null; 
      } 
      else if(isItALeftChild){ 
       parent.leftChild = null; 
      } 
      else { 
       parent.rightChild = null; 
      } 
     } 
     else if(focusNode.rightChild == null){ 
      if(focusNode == root) 
       root = focusNode.leftChild; 
      else if(isItALeftChild) 
       parent.leftChild = focusNode.leftChild; 
      else parent.rightChild = focusNode.leftChild; 
     } 
     else if(focusNode.leftChild == null){ 
      if(focusNode == root) 
       root = focusNode.rightChild; 
      else if(isItALeftChild) 
       parent.leftChild = focusNode.rightChild; 
      else 
       parent.rightChild = focusNode.leftChild; 
     } 
     else { 
      Node replacement = getReplacementNode(focusNode); 

      if(focusNode == root) 
       root = replacement; 

       else if (isItALeftChild) 
        parent.leftChild = replacement; 
       else 
        parent.rightChild = replacement; 
       replacement.leftChild = focusNode.leftChild; 
      } 
      return true; 
     } 


    public Node getReplacementNode(Node replacedNode){ 
     Node replacementParent = replacedNode; 
     Node replacement = replacedNode; 

     Node focusNode = replacedNode.rightChild; 

     while (focusNode != null){ 
      replacementParent = replacement; 
      replacement = focusNode; 
      focusNode = focusNode.leftChild; 
     } 
     if(replacement != replacedNode.rightChild){ 
      replacementParent.leftChild = replacement.rightChild; 
      replacement.rightChild = replacedNode.rightChild; 
     } 
     return replacement; 
    } 

    public static void main(String[] args) { 

     DatosTarea9 theTree = new DatosTarea9(); 
     theTree.addNode(82, "Jorge"); 
     theTree.addNode(74, "Javier"); 
     theTree.addNode(66, "Jose"); 
     theTree.addNode(38, "Jaime"); 
     theTree.addNode(94, "Andres"); 
     theTree.addNode(88, "Alejandro"); 
     theTree.addNode(42, "Adrian"); 
     theTree.addNode(79, "Alan"); 

     System.out.println("Remove all keys below 75"); 
     theTree.remove(key<=75); 

     theTree.inOrderTraverseTree(theTree.root); 
    } 
} 

class Node { 
    int key; 
    String name; 

    Node leftChild; 
    Node rightChild; 

    Node(int key, String name) { 
     this.key = key; 
     this.name = name; 
    } 
    public String toString(){ 
     return name + " has a key " + key; 
    } 
} 
+0

ヘルパー 'removeWithCondition()'を追加し、比較関数または述語関数を渡すことができます。 – ChiefTwoPencils

+0

返答ありがとうございます。私は 'removeWithCondition()'に関するドキュメントを見つけることができませんでした。どうすれば実装できますか – Dotol

+0

なぜドキュメンテーションが見つかりましたか?さらに、条件を満たすすべてのノードを削除する唯一の方法は、inOrderTraversalを実行して同時に削除することです –

答えて

0

あなたはあなたがそれらを書き、発表された後まで、上の任意のドキュメントを見つけることはありません。アイデアは自分で実装する必要があるということです。 ノードを削除するには、同じ名前のプライベートメソッドを呼び出します

public void removeByPredicate(Predicate<Node> predicate) { 
    removeByPredicate(root, predicate); 
} 

:あなたは私がするようなものだ示唆したように、あなたが方法に探している機能を渡すことができる方法例えば

述語テストに合格する。あなたはそれが好きで使用することができます

Tree t = new Tree(); 
    t.removeByPredicate(n -> n.key <= 75); 

そして、あなたは次のように述語関数を使用します。あなたが軌道に乗るかもしれない

if (predicate.test(node)) 
    remove(node); 

。素晴らしいことは、その時点でニーズに合ったテストを動的に変更できることです。コメントで指摘されているように、ノードのすべてを削除するにはもう少し考えが必要です。

関連する問題