Υπολογίστε το βάθος ενός δυαδικού δέντρου αναζήτησης;

ψήφοι
0

Έχω δυσκολία υπολογισμού του αθροίσματος των βάθη [το άθροισμα των επιμέρους βάθη για όλα τα παιδιά της ρίζας] για ένα δεδομένο BST. Έχω το συνολικό αριθμό των κόμβων για το δέντρο, και προσπαθώ να υπολογίσει το μέσο βάθος για το δέντρο, απαιτώντας έχω αυτό το βάθος ποσό.

Αναδρομή και δεν παίρνω μαζί πολύ καλά .. Είμαι εξεύρεση αυτό το πρόβλημα είναι πολύ δύσκολο. Θα ήθελα να δω μια αναδρομική λύση όμως, αν είναι δυνατόν.

ΣΗΜΕΙΩΣΗ:

Έχω δημιουργήσει accessors Node.getLeft () και Node.getRight ()

Δημοσιεύθηκε 09/12/2009 στις 21:03
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
2

Σκεφτείτε για το πώς θα πάτε γι 'αυτό κανονικώς με το χέρι, αν είχα παρουσίασε μια εικόνα ενός BST σας σε ένα φύλλο χαρτιού. Όταν είστε σε ένα κόμβο, τι πληροφορίες χρειάζεστε για να παρακολουθείτε; Πως μπορεί κάποιος να βρει το ύψος ενός συγκεκριμένου κόμβου;

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

Απαντήθηκε 09/12/2009 στις 21:08
πηγή χρήστη

ψήφοι
4

Απλά πρέπει να κρατήσει ένα μετρητή βάθους καθώς διασχίζουν το δέντρο (αναζήτηση διελεύσεις δέντρο, αν έχετε να) και προσθέστε την τιμή του μετρητή κάθε φορά που θα καταλήξει σε κόμβο. Στη συνέχεια, απλώς διαιρέστε με τον αριθμό των κόμβων.

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

Απαντήθηκε 09/12/2009 στις 21:09
πηγή χρήστη

ψήφοι
0

Είναι αυτό το σπίτι; Αν ναι ετικέτα το ερώτημα ως τέτοια.

Θα μπορούσατε να δημιουργήσετε μια μέθοδο που:

  • έχει μια αναφορά κόμβο και βάθος ως επιχειρήματα
  • αύξηση βάθος
  • αν ο κόμβος δεν είναι μια πρόσκληση κόμβο παιδί αναδρομικά για το αριστερό και το δεξί και ενημέρωση ποσό ανάλογα
  • Αλλιώς επιστρέψει άθροισμα + βάθος

Μόλις έχετε αυτό το υποδιαιρέσεις της από τον αριθμό των παιδιών στο δέντρο για να πάρει το μέσο βάθος.

Απαντήθηκε 09/12/2009 στις 21:10
πηγή χρήστη

ψήφοι
0

Πρέπει να επισκεφτείτε όλους τους κόμβους φύλλα και να καταλάβω πόσο βαθιά είναι. Αυτό σημαίνει:

Δώστε σας λειτουργία κόμβου-επισκέπτονται ένα επιπλέον επιχείρημα. Θα πρέπει να γνωρίζει όχι μόνο πού πηγαίνει, αλλά και πόσο βαθιά είναι. Κάθε φορά που ονομάζεται, λέγεται για να πάει πιο βαθιά, έτσι ώστε ο κόμβος ο επισκέπτης σας έχει μόνο για να αυξήσετε τον αριθμό βάθος πήρε από τον καλούντα.

Τώρα, ένα από τα 2 πράγματα μπορούν να συμβούν:

  • Είτε ο κόμβος που βρήκατε είναι ένας κόμβος φύλλο, δηλαδή δεν έχει κανένα παιδιά? σε αυτή την περίπτωση, ο επισκέπτης σας θα πρέπει να επιστρέψει το βάθος της στον καλούντα. Ναι, επιστρέφει μόνο τον αριθμό που πήρε από τον καλούντα, + 1.

  • ή δεν είναι ένας κόμβος φύλλο. Σε αυτή την περίπτωση, θα πρέπει είτε 1 ή 2 παιδιά. Θα πρέπει να πάρετε αυτές τις εκθέσεις βάθος από τα παιδιά μας πίσω μέχρι τον καλούντα, έτσι απλά να επιστρέψει το ποσό των βάθη επιστρέφονται από τα παιδιά.

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

Για να πάρετε ένα μέσο βάθος, θα θέλετε να διαιρέσετε αυτό με τον αριθμό των κόμβων φύλλων? το οποίο είχα αφήσει σε δεύτερη διάσχιση για τον υπολογισμό. Θα μπορούσε να γίνει σε ένα, αλλά θα είναι λίγο πιο περίπλοκη.

Απαντήθηκε 09/12/2009 στις 21:26
πηγή χρήστη

ψήφοι
0

Δεδομένου ότι πρόκειται για την εργασία, δεν θέλω να σας δώσω μια απάντηση. Αντ 'αυτού, εδώ είναι ένα αναδρομικό τρόπο για να υπολογίσει το μήκος ενός μεμονωμένα συνδεδεμένη λίστα. Ας ελπίσουμε ότι αυτό θα αποδείξει αναδρομή με έναν τρόπο που μπορείτε να καταλάβετε, και μπορείτε να προεκτείνουν από εκεί για να λύσει το πρόβλημα BST σας.

public final class LL {
    public final int value;
    public LL next;

    public LL(final int value) {
        this.value = value;
    }

    public void add(final int value) {
        if (null == next) {
            next = new LL(value);
        } else {
            next.add(value);
        }
    }

    /**
     * Calculate the length of the linked list with this node as its head (includes this node in the count).
     *
     * @return the length.
     */
    public int length() {
        if (null == next) {
            return 1;
        }
        return 1 + next.length();
    }

    public static void main(final String... args) {
        final LL head = new LL(1);
        head.add(2);
        head.add(3);
        System.out.println(head.length());
        System.out.println(head.next.length());
    }
}
Απαντήθηκε 09/12/2009 στις 21:57
πηγή χρήστη

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