Αναδρομικά Αναζήτηση στο Binary Tree

ψήφοι
0

μπορεί κάποιος να με βοηθήσει για να εντοπίσει αυτό το κομμάτι του κώδικα αν είναι σωστό ή incorrect.i Σπουδάζω αναδρομή αυτές τις μέρες.

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;
}
Δημοσιεύθηκε 07/08/2011 στις 13:44
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
3

στερείται σταματήσει την κατάσταση. θα πρέπει να ελέγξετε αν t.left == null, ή θα πάρετε NullPointerException. Επίσης, θα πρέπει να επιστρέψετε t.left.isExist(..)ή t.right.isExist(...)και να μην isExist [θα θελήσετε να επικαλεστεί αυτή τη μέθοδο για τον γιο]

προς το παρόν, αυτή η έκδοση θα μπει σε ατέρμονα βρόχο - γιατί θα ελέγχετε πάντα με τον ίδιο κόμβο.

Απαντήθηκε 07/08/2011 στις 13:47
πηγή χρήστη

ψήφοι
1

Ο κωδικός σας δεν είναι συμμετρική.

για τη μία πλευρά, σας καλούν isExist(t.left)για άλλη σας καλούνisExist(a.right)

Πιθανότατα θέλετε να καλέσετε t.left.isExist(a)και t.right.isExist(a), αλλά αυτό είναι καθαρά θεωρητική, δεν έχετε μια πλήρη SSCCE για μας να δούμε.

Απαντήθηκε 07/08/2011 στις 13:52
πηγή χρήστη

ψήφοι
0

Είναι συντακτικά σωστό Java. Αλλά δεν βλέπω πώς θα μπορούσε, ενδεχομένως, να κάνει ό, τι σκοπεύετε.

Φαίνεται ότι η παράμετρος «στοιχείο» είναι το πράγμα που ψάχνετε και η «πρώτη» τομέα στην τρέχουσα κατηγορία είναι η ρίζα του δυαδικού δέντρου.

Είναι ασαφές εάν το κλειδί για το δυαδικό δέντρο και αναζήτησης (στην κατηγορία Element) είναι «περιουσιακό στοιχείο» ή «δεδομένα». Το «λιγότερο από» τεστ χρησιμοποιεί «περιουσιακό στοιχείο», ενώ το «μεγαλύτερο από» «δεδομένα» χρήσεις της δοκιμής. Φαίνεται πιθανό ότι και οι δύο γραμμές θα πρέπει να χρησιμοποιούν το ίδιο πεδίο. Θα μπορούσε να είναι ότι ένας από αυτούς τους δύο τομείς ( «περιουσιακό στοιχείο» ή «δεδομένα») θα πρέπει να μην να αναφέρονται σε αυτή τη μέθοδο σε όλα. Ίσως η τελευταία γραμμή της μεθόδου θα πρέπει να απλά «return true?»;

(Υποψιάζομαι ότι η «κατάσταση stop» και ο «κώδικας δεν είναι συμμετρική» απαντήσεις παραπάνω είναι τόσο λανθασμένη, όμως, θα μπορούσα να κάνω λάθος. Είναι δύσκολο να πει μόνο με τον κωδικό δοθεί.)

Συμφωνώ ότι άπειρο looping είναι πιθανό: Υποψιάζομαι ότι θα πρέπει να δημιουργήσετε ένα δεύτερο «ψάξετε» λειτουργία που δέχεται δύο παραμέτρους «στοιχείο» - ο ένας να είναι το πράγμα για να αναζητήσετε (όπως η τρέχουσα παράμετρο «στοιχείο») και το άλλο ον το επόμενο στοιχείο για να ψάξετε - το ισοδύναμο του τρέχοντος τοπική μεταβλητή «γ». Θα ήθελα να κάνω την refactoring «Απόσπασμα Μέθοδος» για τα πάντα στο σώμα της τρέχουσας μεθόδου «αναζήτηση», εκτός από την πρώτη γραμμή, και στη συνέχεια, αλλάξτε τις δύο αναδρομικές κλήσεις για να χρησιμοποιήσετε τη νέα μέθοδο.

(Μερικά από αυτό είναι κερδοσκοπικές, που βασίζεται πάνω μου μαντέψουν τι θέλετε ή σκοπεύετε, λόγω της περιορισμένης πληροφόρησης. Γι 'αυτό και θα μπορούσε, φυσικά, να είναι εντελώς λάθος.)

Απαντήθηκε 09/08/2011 στις 03:11
πηγή χρήστη

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