Java BinarySearchTrees: Eingabeschlüssel Rückgabewert (Lookup)

stimmen
0

Ich versuche, einen Datenbank-Schnittstelle BSTs zu implementieren. Ich habe eine innere Klasse BTSEntry die einen Knoten mit den Variablen Schlüssel, Wert und links / rechts-Knoten darstellt. Jeder linke Knoten weniger (in alphabetischer Reihenfolge) als seine Eltern, während jeder rechter Knoten größer als seine Mutter ist.

Das erste Problem ist, dass ich weiß nicht, was die „nextNode ()“ ist im Entry innere Klasse sein sollte. Ist es einfach der richtige Knoten? Oder ist es, was ich unten getan?

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

Das zweite Problem ist, dass ich nicht wirklich wissen, wie man den „Int Wert get (Str key)“ Methode zu implementieren. EDIT: Ich habe versucht, die get (key) Methode zu tun. Ist es richtig? Arbeitet für diese Rekursion?

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 ist, was ich bisher getan haben. Jede Hilfe wäre sehr dankbar! :)

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


}
Veröffentlicht am 13/03/2011 um 21:04
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Ich weiß nicht genau, was Ihre getNext () -Methode tun soll, aber ich vermute, es sollte die nächste größte Element erhalten. Wenn das der Fall ist, dann sieht es aus wie das, was Sie tun, richtig ist.

Ihre zweite Frage, nein, Rekursion wird nicht funktionieren. Sie (wahrscheinlich) wollen eine Schleife verwenden, bis die Taste entweder der aktuelle Knoten geht haben Sie suchen (und gibt den Wert wie Sie tun), oder bis keine links oder rechts ist der Knoten zu überprüfen links (die curr Knoten ist null). Auch auf der Grundlage der Methode Header, es sieht aus wie Sie eine Ausnahme ausgelöst werden sollen, wenn der Schlüssel nicht eher gefunden als null zurück. Es sieht aus wie Sie die richtigen Voraussetzungen haben, müssen Sie nur auf einige kleinere Änderungen brauchen, was es tut, wenn diese Bedingungen erfüllt sind.

Beantwortet am 13/03/2011 um 23:41
quelle vom benutzer

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