java binaire zoekboom

stemmen
0

Ik heb een vraag over hoe zou ik een kind van een knooppunt (root) wilt verwijderen? Omdat ik niet kan bellen te verwijderen, als ik het kind null, zal de kinderen van dat kind omhoog? Zoals, zou ik initialiseren net zo null ?? Of wil ik wijzen op kind van het kind?

De vraag is gesteld op 31/10/2009 om 20:40
bron van user
In andere talen...                            


6 antwoorden

stemmen
2

In een traditionele binaire zoekboom, kan verwijdering van een knooppunt verschillende gevolgen hebben, afhankelijk van hoeveel kinderen het knooppunt heeft:

  • Een knooppunt zonder kind kan eenvoudig worden verwijderd
  • Een knooppunt met een kind kan worden verwijderd, en het knooppunt wordt vervangen door zijn enig kind. Dit geldt ongeacht of het kind is een links of rechts kind.
  • Een knooppunt met twee kinderen heeft een iets ingewikkelder regel: je moet het gedeelte in-order opvolger of in-order voorganger van het knooppunt te verwijderen, vervangt de waarde van het huidige knooppunt met zijn sucessor of de waarde van zijn voorganger, delete dan de opvolger of voorganger (volgens de regels).
antwoordde op 31/10/2009 om 20:49
bron van user

stemmen
0

Is dit huiswerk? Niks mis mee ... we willen alleen maar om mensen te helpen te leren in plaats van hen vertellen de antwoorden.

Als je gewoon stel het kind knooppunt naar null je alle informatie over de kind kinderen verliezen.

antwoordde op 31/10/2009 om 20:51
bron van user

stemmen
0

Een standaard boom klasse zal weten zijn kinderen, meestal vast te zitten in een array of Collection - in het geval van een binaire boom, heb je maar twee rechtstreekse kinderen, zodat een vast formaat array zal werken. Vanwege dat, ze meestal uit te voeren een soort van "removeMe" methode dat het kind vraagt ​​om aan de slag verwijderd uit die lijst van kinderen houden.

Zoals hierboven vermeld, wordt dit ingewikkeld als het kind dat u het verwijderen van kinderen heeft.

antwoordde op 31/10/2009 om 21:33
bron van user

stemmen
0

Tim's antwoord lijkt best. Maar ja je zal willen doen één van drie dingen afhankelijk van wat voor soort kind het is uw verwijderen. Als je een kind nul te maken, zal de kinderen van het niet omhoog, omdat je hebt verloren verwijzing naar hen. In plaats daarvan, wil je om te bepalen of de links of rechts kinderen van het kind je het verwijderen moet worden ingesteld op de wijzer wijst naar het kind uw verwijderen. Na het instellen van de vorige knooppunten pointer (links of rechts) om het kind (links of rechts) van het knooppunt uw verwijderen, je gewoon een referentie niet meer naar dat knooppunt, zodat theres geen noodzaak om op null (u kunt' t toegang tot het niet meer. Tenzij u schreef een soort dubbel-gekoppelde BST, in welk geval dat is niet de klassieke BST)

antwoordde op 01/11/2009 om 00:20
bron van user

stemmen
0

Deze code moet je helpen

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));
}
antwoordde op 13/02/2011 om 10:14
bron van user

stemmen
0

Je kunt zoiets als dit (pseudo code) doen:

Bij een van de wortel van de boom "root" en het knooppunt te verwijderen of sommige gegevens "x" het volgende doen

 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;

}

antwoordde op 09/09/2014 om 20:33
bron van user

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