Java BinarySearchTrees: entrée clé valeur de retour (recherche)

voix
0

Je suis en train de mettre en œuvre une interface de base de données à l'aide BSTS. Je BTSEntry une classe interne qui représente un noeud à des variables clé, la valeur et les noeuds gauche / droite. Chaque noeud gauche est moins (dans l'ordre alphabétique) que son parent, alors que chaque nœud droit est plus grand que son parent.

Le premier problème est que je ne sais pas quel est le « nextNode () » dans la classe interne d'entrée censé être. Est-ce simplement le nœud droit? Ou est-ce que je l'ai fait ci-dessous?

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

Le deuxième problème est que je ne sais pas vraiment comment implémenter la méthode « get valeur Int (touche Str) ». EDIT: J'ai essayé de faire la méthode get (clé). Est-ce correct? Est-ce que récursivité travail pour cela?

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

Voici ce que je l'ai fait jusqu'à présent. Toute aide serait grandement appréciée! :)

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


}
Créé 13/03/2011 à 21:04
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Je ne sais pas exactement ce que votre méthode getNext () est censé faire, mais je devine qu'il devrait obtenir le prochain plus grand élément. Si tel est le cas, alors il ressemble à ce que vous faites est correct.

Pour votre deuxième question, non, récursivité ne fonctionnera pas. Vous (probablement) veulent utiliser une boucle qui va jusqu'à ce que le nœud actuel est la clé que vous recherchez (et retourner la valeur comme vous faites), ou jusqu'à ce qu'il n'y a pas un nœud gauche ou à droite à gauche pour vérifier (la curr noeud est nulle). De plus, selon l'en-tête de la méthode, il semble que vous voulez lancer une exception si la clé ne se trouve pas plutôt que de retourner nulle. On dirait que vous avez les bonnes conditions, il faut juste quelques modifications mineures à ce qu'il fait quand ces conditions sont vraies.

Créé 13/03/2011 à 23:41
source utilisateur

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