Java BinarySearchTrees: inngang nøkkelen tilbake verdi (oppslag)

stemmer
0

Jeg prøver å implementere en database grensesnitt ved hjelp BSTs. Jeg har en indre klasse BTSEntry som representerer en node med variable nøkkel, verdi og venstre / høyre noder. Hver venstre node er mindre (i alfabetisk rekkefølge) enn sin overordnede, mens hver rett node er større enn dens forelder.

Det første problemet er at jeg ikke vet hva er nextNode () i Entry indre klassen ment å være. Er det bare rett node? Eller er det det jeg har gjort under?

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

Det andre problemet er at jeg ikke vet hvordan de skal implementere Int verdi get (Str tasten) metoden. EDIT: Jeg har prøvd å gjøre get (tasten) metoden. Er det riktig? Vil Rekursjon arbeid for dette?

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

Her er hva jeg har gjort så langt. Eventuelle hjelpe ville være verdsatt! :)

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


}
Publisert på 13/03/2011 klokken 20:04
kilden bruker
På andre språk...                            


1 svar

stemmer
0

Jeg vet ikke nøyaktig hva din GetNext () metoden er ment å gjøre, men jeg tipper at det bør få den neste største element. Hvis det er tilfelle, så det ser ut som det du gjør er riktig.

For det andre spørsmålet, nei, rekursjon vil ikke fungere. Du vil (sannsynligvis) vil bruke en sløyfe som går til enten den aktuelle noden har nøkkelen du er ute etter (og returnere verdien som du gjør), eller til det er ikke en venstre eller høyre node venstre for å sjekke (den curr node er null). Også basert på metoden header, ser det ut som du vil ønske å kaste et unntak hvis nøkkelen ikke er funnet stedet for å returnere null. Det ser ut som du har de rette forholdene, du trenger bare noen mindre endringer i hva den gjør når disse betingelsene er oppfylt.

Svarte 13/03/2011 kl. 22:41
kilden bruker

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