java arbore binar de căutare

voturi
0

Am o întrebare cu privire la modul în care mi-ar elimina un copil dintr-un nod (rădăcină)? Din moment ce eu nu pot apela eliminați, dacă am face nul copil, va copiii acelui copil deplasa? Ca, aș doar inițializa ca nul ?? Sau aș indica copilului copilului?

Întrebat 31/10/2009 la 20:40
sursa de către utilizator
În alte limbi...                            


6 răspunsuri

voturi
2

Într-un arbore binar de căutare tradiționale, eliminarea unui nod poate avea consecințe diferite, în funcție de cât de mulți copii nodul are:

  • Un nod fără copii pot fi pur și simplu eliminate
  • Un nod cu un singur copil poate fi îndepărtată, iar nodul va fi înlocuit cu singurul său copil. Acest lucru se aplică indiferent dacă copilul este un copil la stânga sau la dreapta.
  • Un nod cu doi copii are o regulă de puțin mai complicat: trebuie să găsească succesorul în ordine sau predecesorului în ordinea nodului care urmează să fie eliminate, înlocuiți valoarea nodului curent cu succesorul său sau valoarea predecesorului lui, apoi ștergeți succesorul sau predecesorul ( în conformitate cu aceste reguli).
Publicat 31/10/2009 la 20:49
sursa de către utilizator

voturi
0

Este aceasta tema? Nimic în neregulă cu asta ... ne place doar pentru a ajuta oamenii să învețe mai degrabă decât să le spun răspunsurile.

Dacă tocmai ați setat nodul copil null veți pierde orice informație cu privire la copii Childs.

Publicat 31/10/2009 la 20:51
sursa de către utilizator

voturi
0

O clasă copac standard, va ști copiii săi, de obicei, blocat într-o matrice sau Collection - în cazul unui arbore binar, ai doar doi copii directe, astfel încât o matrice de dimensiuni fixe vor lucra. Din acest motiv, acestea pun în aplicare, de obicei, un fel de metodă „removeMe“, care solicită copilul să se eliminat din această listă de copii.

După cum sa menționat mai sus, acest lucru devine complicat în cazul în care copilul înlăturați are copii.

Publicat 31/10/2009 la 21:33
sursa de către utilizator

voturi
0

răspunsul lui Tim pare cel mai bine. Dar da, veți dori să facă una dintre cele trei lucruri, în funcție de ce fel de copil este eliminarea ta. Dacă face un copil nul, copiii lui nu se va deplasa în sus pentru că v-ați pierdut referire la ele. În schimb, veți dori să determine dacă copiii la stânga sau la dreapta ale copilului eliminând ar trebui să fie setat la îndreptat indicatorul copilului eliminând. După ce ați setat anterior, nodurile pointer (stânga sau dreapta) a copilului (stânga sau dreapta) a nodului eliminând, aveți obiceiul o referință mai la acel nod, astfel încât theres nu este nevoie să se stabilească la null (poți“ t mai de acces la aceasta. Doar dacă ai scris un fel de BST dublu legat, caz în care nu este BST clasic)

Publicat 01/11/2009 la 00:20
sursa de către utilizator

voturi
0

Acest cod ar trebui să vă ajute

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));
}
Publicat 13/02/2011 la 10:14
sursa de către utilizator

voturi
0

Puteți face ceva de genul asta (cod pseudo):

Având în vedere o rădăcină de copac „rădăcină“ și nodul pentru a șterge sau a unor date „x“, efectuați următoarele

 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;

cod:

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;

}

Publicat 09/09/2014 la 20:33
sursa de către utilizator

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