2016-05-03 2 views
0

я, наконец, получил свою BST работу и свои функции, хотя теперь я хочу, чтобы удалить все узлы, которые имеют ключ, который равен или меньше, чем 75.Добавление условия для удаления нескольких BST узлов

Я пытался добавить операция как: theTree.remove(key<=75); и несколько других способов, я знаю, что синтаксис, чтобы сделать что-то не так, но я не могу найти соответствующую информацию в Интернете относительно того, как это сделать. Любые советы помогут.

Код:

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); 

Это может заставить вас идти. Приятно, что тест может динамически меняться в зависимости от потребностей в то время. Как отмечалось в комментарии, потребуется немного больше думать, чтобы получить всех удаленных узлов.

Смежные вопросы