Java BinarySearchTrees: invoertoets return value (lookup)

stemmen
0

Ik probeer uit te voeren een database-interface met behulp van BSTS. Ik heb een binnenklasse BTSEntry die een knooppunt met variabele sleutel, prijs en links / rechts knooppunten voorstelt. Elke linker node minder (in alfabetische volgorde) dan de ouder, waarbij elke rechter knooppunt is groter dan de ouder.

Het eerste probleem is dat ik niet weet wat is de nextNode () in de Entry innerlijke klasse hoort te zijn. Is het gewoon de juiste knooppunt? Of is het wat ik hieronder heb gedaan?

private BinarySearchTreeEntry getLeftMost() {
        BinarySearchTreeEntry n = this;
        while (n.left != null) {
            n = n.left;
        }
        return n;
    }

    public BinarySearchTreeEntry getNext() {
        if (right != null) {
            return right.getLeftMost();
        } else {
            BinarySearchTreeEntry n = this;
            while (n.parent != null && n == n.parent.right) {
                n = n.parent;
            }
            return n.parent;
        }
    }

Het tweede probleem is dat ik niet echt weet hoe de Int waarde te krijgen (Str key) methode te implementeren. EDIT: Ik heb geprobeerd om de get (key) methode te doen. Klopt het? Zal werk Recursie voor dit?

public Integer get(String key) throws NoSuchElementException {
    BinarySearchTreeEntry curr = root;
    if(curr == null){
        return null;
    } else if(curr.getKey().equals(key)){
        return curr.getValue();
    } else if(key.compareTo(curr.getKey()) < 0){
        curr = curr.getLeft();
        get(key);
    } else{
        curr = curr.getRight();
        get(key);
    }

    return null;
}

Hier is wat ik tot nu toe heb gedaan. Alle hulp zou zeer gewaardeerd worden! :)

    package database;

import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Stack;

public class BinarySearchTree<K, V> implements Dictionary<String, Integer> {

    private class BinarySearchTreeEntry 
    implements DictionaryEntry<String, Integer>{    
        private String key;
        private Integer value;
        private BinarySearchTreeEntry left;
        private BinarySearchTreeEntry right;
        private BinarySearchTreeEntry parent;

        BinarySearchTreeEntry(String key, Integer value, 
        BinarySearchTreeEntry left, 
        BinarySearchTreeEntry right) {
            this.key = key;
            this.value = value;
            this.left = left;
            this.right = right;
            if (left != null) left.parent = this;
            if (right != null) right.parent = this;
        }
        private BinarySearchTreeEntry getLeftMost() {
            BinarySearchTreeEntry n = this;
            while (n.left != null) {
                n = n.left;
            }
            return n;
        }

        private BinarySearchTreeEntry getRightMost() {
            BinarySearchTreeEntry n = this;
            while (n.right != null) {
                n = n.right;
            }
            return n;
        }


        public BinarySearchTreeEntry getNext() {
            if (right != null) {
                return right.getLeftMost();
            } else {
                BinarySearchTreeEntry n = this;
                while (n.parent != null && n == n.parent.right) {
                    n = n.parent;
                }
                return n.parent;
            }
        }

        public String getKey() {

            return key;
        }

        public Integer getValue() {

            return value;
        }

        public BinarySearchTreeEntry getLeft() {
            return left;
        }

        public BinarySearchTreeEntry getRight() {
            return right;
        }

    }

    private class ListIterator
    implements Iterator<DictionaryEntry<String, Integer>>  {

        private BinarySearchTreeEntry current;
        Stack<BinarySearchTreeEntry> workList;

        public ListIterator(BinarySearchTreeEntry entry){
            current = entry;
        }

        public boolean hasNext() {
            return current != null;
        }


        public BinarySearchTreeEntry next() {
            BinarySearchTreeEntry result = null;
            current = root;

            while(current!=null){
                workList.push(current);
                current = current.getLeft();
            }

            if(!workList.isEmpty()){
                result = (BinarySearchTreeEntry) workList.pop();
                current = result.getRight();
            }
            return result;
        }

        public void remove() {

        }

    }

    private BinarySearchTreeEntry root;
    private int items;

    public BinarySearchTree(){
        root = null;
        items = 0;
    }

    public int size() {
        ListIterator iter = iterator();
        while(iter.hasNext()){
            items += 1;
        }
        return items;
    }

    public boolean isEmpty() {

        return size() == 0;
    }

    public Integer get(String key) throws NoSuchElementException {
        BinarySearchTreeEntry curr = root;
        if(curr == null){
            return null;
        } else if(curr.getKey().equals(key)){
            return curr.getValue();
        } else if(key.compareTo(curr.getKey()) < 0){
            //Now what?
        }
        return null;
    }


    public void put(String key, Integer value) {

    }

    public void clear() {
        ListIterator iter = iterator();
        BinarySearchTreeEntry  curr;
        curr = root;
        while(iter.hasNext()){
            remove(curr.getKey());
            curr = iter.next();
        }
        remove(curr.getKey());
    }

    public void remove(String key) throws NoSuchElementException {


    }

    public ListIterator iterator() {
        return (new ListIterator(root));
    }


}
De vraag is gesteld op 13/03/2011 om 21:04
bron van user
In andere talen...                            


1 antwoorden

stemmen
0

Ik weet niet precies wat uw getNext () methode verondersteld wordt te doen, maar ik gok dat het zou de volgende grootste element te krijgen. Als dat het geval is, dan lijkt het erop dat wat je doet juist is.

Voor uw tweede vraag, nee, terugkeer zal niet werken. U zult (waarschijnlijk) wil een lus die gaat totdat het huidige knooppunt heeft de sleutel die u op zoek bent naar het gebruik (en de terugkeer van de waarde als je doet), of totdat er geen links of rechts knooppunt links om te controleren (de curr knooppunt null). Ook, gebaseerd op de methode-header, het lijkt erop dat u zult willen een uitzondering te gooien als de sleutel niet eerder wordt gevonden dan terug te keren null. Het lijkt erop dat je hebt de juiste omstandigheden, je hoeft alleen maar een paar kleine wijzigingen in wat het doet wanneer die voorwaarden wordt voldaan.

antwoordde op 13/03/2011 om 23:41
bron van user

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