Java BinarySearchTrees: intrare valoarea cheii de retur (căutare)

voturi
0

Am încercat să pună în aplicare o interfață de bază de date folosind BSTs. Am o BTSEntry clasă interioară, care reprezintă un nod cu variabile cheie, valoare și noduri stânga / dreapta. Fiecare nod din stânga este mai mică (în ordine alfabetică) decât mamă, în timp ce fiecare nod dreapta este mai mare decât părintele său.

Prima problemă este că eu nu știu ce este „nextNode ()“ din clasa interioară de intrare ar trebui să fie. Este pur și simplu nodul corect? Sau este ceea ce am făcut mai jos?

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 doua problemă este că nu știu cu adevărat cum să pună în aplicare „Int valoarea get (tasta STR)“ metoda. EDIT: Am încercat să fac metoda get (cheie). Este corect? Va recursivitate de lucru pentru asta?

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

Iată ce am făcut până acum. Orice ajutor ar fi apreciat foarte mult! :)

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


}
Întrebat 13/03/2011 la 21:04
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
0

Nu știu exact ce se presupune metoda getNext () pentru a face, dar cred că ar trebui să obțineți următorul cel mai mare element. Dacă acesta este cazul, atunci se pare ca ceea ce faci este corect.

Pentru a doua întrebare, nu, recurențe nu va funcționa. Vei (probabil) doriți să utilizați o buclă care merge până fie nodul curent are cheia pe care il cautati (și returnează valoarea ca faci), sau până când nu există un nod la stânga sau la dreapta la stânga pentru a verifica (The nod curr este nul). De asemenea, bazat pe antetul metodei, se pare că va dori să arunce o excepție în cazul în care cheia nu este găsit în loc să returneze null. Se pare că ai condițiile potrivite, trebuie doar câteva modificări minore la ceea ce face atunci când aceste condiții sunt adevărate.

Publicat 13/03/2011 la 23:41
sursa de către utilizator

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