Ricorsivamente Ricerca su un albero binario

voti
0

qualcuno può aiutarmi a tracciare questo pezzo di codice se il suo corretto o incorrect.i sto studiando la ricorsione in questi giorni.

boolean search(Element element) {
    Element c=first;
    if(c==null)
        return false;
    else if(element.asset < c.asset)
        if(c.left==null)
            return false;
        else
            return search(c.left);
    else if(element.data>c.data)
        if(c.right==null)
            return false;
        else
            return search(c.right);
     else  
         return element.asset==c.asset;
}
È pubblicato 07/08/2011 alle 13:44
fonte dall'utente
In altre lingue...                            


3 risposte

voti
3

manca smettere di condizione. si dovrebbe verificare se t.left == null, o avrete NullPointerException. Inoltre, si dovrebbe tornare t.left.isExist(..)OR t.right.isExist(...)e non isExist [si vuole richiamare questo metodo per il figlio]

Al momento, questa versione sarà entrare in loop infinito - perché avrete sempre il check-in nello stesso nodo principale.

Risposto il 07/08/2011 a 13:47
fonte dall'utente

voti
1

Il tuo codice non è simmetrica.

per un lato, si chiama isExist(t.left), per un altro si chiamaisExist(a.right)

Probabilmente si desidera chiamare t.left.isExist(a)e t.right.isExist(a), ma che è puramente speculativa in quanto non si dispone di una completa SSCCE per noi a guardare.

Risposto il 07/08/2011 a 13:52
fonte dall'utente

voti
0

E 'sintatticamente corretto Java. Ma non vedo come potrebbe eventualmente essere facendo quello che si intende.

Sembra che il parametro 'elemento' è la cosa si sta cercando e il campo 'prima' della classe corrente è la radice dell'albero binario.

Non è chiaro se la chiave per l'albero binario e di ricerca (nella classe Element) è 'bene' o 'dati'. Il test 'meno di' usa 'bene', mentre il 'maggiore di' 'dati' di test usi. Sembra probabile che entrambe le linee devono utilizzare lo stesso campo. Potrebbe essere che uno di questi due campi ( 'attivi' o 'dati') dovrebbe non essere fatto riferimento in questo metodo a tutti. Forse l'ultima riga del metodo dovrebbe essere solo 'return true;'?

(Ho il sospetto che la "condizione di arresto" e il "codice non è simmetrico" le risposte di cui sopra sono entrambi errati Ma potrei sbagliarmi. E 'difficile dire con solo il codice data.)

Sono d'accordo che loop infinito è probabile: ho il sospetto che è necessario creare una seconda funzione 'search' che accetta due parametri 'Element' - uno è la cosa da cercare (come il parametro corrente 'elemento') e l'altro essere il prossimo elemento per la ricerca - l'equivalente di corrente locale variabile 'c'. Vorrei fare il refactoring "Extract Method" su tutto nel corpo del metodo attuale 'ricerca', tranne la prima linea, e quindi modificare le due chiamate ricorsive per utilizzare il nuovo metodo.

(Alcune di queste è speculativo, basata su di me cercando di indovinare ciò che si desidera o ha intenzione, dato informazioni limitate. Così ho potuto, ovviamente, del tutto sbagliato.)

Risposto il 09/08/2011 a 03:11
fonte dall'utente

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