Java BinarySearchTrees: input gombot visszatérési érték (keresés)

szavazat
0

Próbálom, hogy végre egy adatbázis interfész használatával BSTs. Van egy belső osztály BTSEntry amely egy csomóponthoz változók kulcs, érték és a bal / jobb csomópontok. Minden balra csomópont kevesebb (ábécé sorrendben), mint a szülő, miközben minden jog csomópont nagyobb, mint az eredeti.

Az első probléma az, hogy nem tudom, mi az a „nextNode ()” az Entry belső osztály kellene lennie. Ez egyszerűen a megfelelő csomópont? Vagy ez mit tettem alább?

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

A második probléma az, hogy én nem igazán tudom, hogyan hajtsák végre a „Int get (Str) gombot” módszer. EDIT: Megpróbáltam csinálni a get (kulcs) módszer. Ez a helyes? Will rekurzió munka ez?

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

Itt van, amit eddig. Minden segítséget lenne nagyon méltányol! :)

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


}
A kérdést 13/03/2011 21:04
a forrás felhasználó
Más nyelveken...                            


1 válasz

szavazat
0

Nem tudom, hogy pontosan mi a getNext () metódus kéne csinálni, de biztos vagyok benne, hogy meg kell szereznie a következő legnagyobb eleme. Ha ez a helyzet, akkor úgy néz ki, mint amit csinál, az helyes.

A második kérdésedre, nem, rekurzió nem fog működni. Lesz (valószínűleg) szeretne használni egy ciklus, ami megy, amíg vagy az aktuális csomópont van a kulcs, amit keres (és visszaadja az értéket, mint te csinálsz), vagy addig, amíg nincs jobb vagy bal csomópont balra ellenőrizni (a Curr csomópont null). Emellett módszeren alapul fejléc, úgy néz ki, lesz akar dobni egy kivételt, ha a kulcs nem található ahelyett, hogy visszatérne null. Úgy tűnik, megvan a megfelelő körülmények között, akkor csak meg kell néhány kisebb változtatásokat, hogy mit csinál, ha ezek a feltételek teljesülnek.

Válaszolt 13/03/2011 23:41
a forrás felhasználó

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