java binärer Suchbaum

stimmen
0

Ich habe eine Frage, wie würde ich ein Kind von einem Knoten (root) entfernen? Da ich entferne nicht anrufen kann, wenn ich das Kind null zu machen, werden die Kinder des Kindes nach oben? Wie würde ich initialisieren es nur als null ?? Oder würde verweise ich auf das Kind Kind?

Veröffentlicht am 31/10/2009 um 20:40
quelle vom benutzer
In anderen Sprachen...                            


6 antworten

stimmen
2

In einem traditionellen binären Suchbaum, die Entfernung eines Knotens kann unterschiedliche Auswirkungen hat, je nachdem, wie viele Kinder der Knoten:

  • Ein Knoten ohne Kinder können einfach entfernt werden
  • Ein Knoten mit einem Kind kann entfernt werden, und der Knoten wird durch sein einziges Kind ersetzt werden. Dies gilt unabhängig davon, ob das Kind ein linkes oder rechtes Kind ist.
  • Ein Knoten mit zwei Kindern hat eine etwas kompliziertere Regel: Sie finden müssen in Ordnung Nachfolger oder in Ordnung Vorgänger des Knotens, werden entfernt , um den aktuellen Knoten Wert mit seinem Nachfolger oder des Vorgängers Wert ersetzen, löschen Sie den Nachfolger oder Vorgänger (nach diesen Regeln).
Beantwortet am 31/10/2009 um 20:49
quelle vom benutzer

stimmen
0

Ist das Hausaufgaben? Nichts falsch mit dem ... möchten wir nur Menschen und nicht sie die Antworten als sagen lernen helfen.

Wenn Sie nur die untergeordneten Knoten auf null gesetzt Sie irgendwelche Informationen über den Childs Kinder verlieren.

Beantwortet am 31/10/2009 um 20:51
quelle vom benutzer

stimmen
0

Eine Standard-Baum-Klasse wird ihre Kinder weiß, in der Regel in einem Array oder eine Sammlung stecken - im Fall eines binären Baumes, du hast nur zwei direkte Kinder, so eine feste Größe Array funktioniert. Dieser Grund, implementieren sie in der Regel eine Art von „removeMe“ Methode, die das Kind aus dieser Liste von Kindern zu erhalten entfernt nennt.

Wie oben erwähnt, wird diese kompliziert, wenn das Kind den Sie entfernen, Kinder hat.

Beantwortet am 31/10/2009 um 21:33
quelle vom benutzer

stimmen
0

Tims Antwort scheint am besten. Aber ja wünschen Sie eine von drei Dinge zu tun, je nachdem, welche Art von Kind es ist, zu entfernen. Wenn Sie ein Kind null machen, werden die Kinder es nicht bewegen, weil man auf sie Bezug verloren haben. Stattdessen sollten Sie, wenn die linke oder rechte Kinder des Kindes sollte Ihre Entfernung zu dem Zeiger, der auf das Kind eingestellt werden, um Ihre Entfernung zu bestimmen. Nachdem Sie die vorherigen Knoten Zeiger (links oder rechts), um das Kind (links oder rechts) des Knotens Ihre entfernen, haben Sie nicht einen Verweis mehr auf diesen Knoten, keine Notwendigkeit, so Theres es auf null gesetzt (Sie können‘gesetzt t Zugriff es nicht mehr. es sei denn, Sie irgendeine Art von doppelt verketteten BST schrieb, in dem Fall, dass nicht die klassische BST ist)

Beantwortet am 01/11/2009 um 00:20
quelle vom benutzer

stimmen
0

Dieser Code sollte Ihnen helfen

public Node<T> getParentOf(Node<T> child){
    findParentOf(this.root, child);
    return temp;
}

private void findParentOf(Node<T> ROOT, Node<T> child){
    if(ROOT.hasLeft()){
        findParentOf(ROOT.left, child);
    }

    if(ROOT.left == child || root.right == child){
        temp = ROOT;
    }

    if(ROOT.hasRight()){
        findParentOf(ROOT.right, child);
    }
}


private void replaceNode(Node<T> original, Node<T> newNode){
    Node<T> tempParent = getParentOf(original);
    if(original == tempParent.left){
        tempParent.left = newNode;
    }else if(original == tempParent.right){
        tempParent.right = newNode;
    }
}

private void traverseChildrenAndAdd(Node<T> newParent, Node<T> oldParent){
    newParent.insert(oldParent.data);
    if(oldParent.hasLeft()){
        traverseChildrenAndAdd(newParent,oldParent.left);
    }



    if(oldParent.hasRight()){
        traverseChildrenAndAdd(newParent,oldParent.right);
    }
}
private void deleteNode(Node<T> ROOT, Node<T> d){
    if(d.data.compareTo(ROOT.data) < 0){
        deleteNode(ROOT.left, d);
    }else if(d.data.compareTo(ROOT.data) > 0){
        deleteNode(ROOT.right, d);
    }else if(d == this.root){
        if(this.root.hasLeft()){
            traverseChildrenAndAdd(root.left, root.right);
            root = root.left;
        }else if(root.hasRight()){
            root = root.right;
        }else{
            root = null;
        }
    }else{
        if(ROOT.hasLeft()&&ROOT.hasRight()){
            Node<T> successor = getMinNode(ROOT);
            replaceNode(successor, successor.right);
        }else if(ROOT.hasLeft() || ROOT.hasRight()){
            if(ROOT.hasLeft()){
                replaceNode(ROOT, ROOT.left);
            }else{
                replaceNode(ROOT, ROOT.right);
            }
        }else{
            replaceNode(ROOT, null);
        }
    }
}

public void remove(T data){
    deleteNode(this.root, new Node<T>(data));
}
Beantwortet am 13/02/2011 um 10:14
quelle vom benutzer

stimmen
0

Sie können so etwas wie dieser (Pseudo-Code) tun:

Bei einer der Wurzel des Baumes „root“ und dem Knoten zu löschen oder einige Daten „x“ die folgenden Schritte aus

 if x < root
      recurse to left child
 if x > root
      recurse to right child
 else //node found
      find the min item of the node right child //min item should be left most leaf node node
      replace the value of the node you want to delete with min nodes value
      now delete the min node
 return root;

Code:

delete(Node root, Object x){
    if(root == null){
        return null;
    }

    if(data < root.data){
        root = delete(root.left);
    }else if(root.data < data){
        root = delete(root.right);
    }else{
        if(root.left != null && root.right != null){
            Object tmp = findMin(root.right);
            root.data = tmp;
            root.right = delete(root.right, tmp);
        }else{
            return (root.left != null) ? root.left : root.right;    
        }
    }
return root;

}

Beantwortet am 09/09/2014 um 20:33
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more