Ανάγκη για να πάρει τον κόμβο φύλλο που έχει ελάχιστο βάθος. Δεν μπορώ να σκεφτώ ένα καλό τρόπο για να το κάνει χωρίς αποθήκευση επιπλέον πληροφοριών σε κάθε κόμβο, παρακαλούμε να προτείνουν, ευχαριστώ πολύ.
βρείτε το μικρότερο κόμβο βάθος των φύλλων στο BST
Η ωμή λύση δύναμη είναι ένα εύρος πρώτο τερματισμού αναζήτησης στο πρώτο φύλλο που βρέθηκαν, αυτό θα είναι ευκολότερο να εφαρμοστεί επαναληπτικά από αναδρομικά.
Δείτε για παράδειγμα την ψευδο-κώδικα στην απάντησή μου στο «Πλάτος Πρώτη Vs Βάθος Πρώτη» απλά προσθέστε μια άλλη προϋπόθεση για την κατά βρόχου.
BTW - Αυτό θα σας πάρει ένα φύλλο με το ελάχιστο βάθος, καθώς μπορεί να υπάρχουν περισσότερα από ένα σε αυτό το βάθος. Να πάρει το σύνολο των ελάχιστων φύλλα βάθος είναι λίγο πιο δύσκολο. Μάλλον πάει με μια επαναληπτική στρατηγική εμβάθυνση .
Ανακαλύπτοντας τι επίπεδο αυτός ο κόμβος είναι μία.
Τρεις επιλογές:
Βρείτε τον κόμβο πρώτη και την αναζήτηση κάτω από το δέντρο για αυτό. Ακούγεται σπάταλη, αλλά ότι η δεύτερη αναζήτησης απαιτεί επισκέπτονται μόνο όσες κόμβους, όπως το επίπεδο, έτσι ώστε να είναι πραγματικά γρήγορα.
Εναλλακτικά, μπορείτε να παρακολουθείτε as you go. Μπορείτε να χρησιμοποιήσετε τρεις μετρητές levelCounter, thisLevelCounterκαι nextLevelCounter. Κάθε φορά που περισσότερο σε ένα νέο κόμβο που ελαττώνει thisLevelCounterκαι όταν μηδενιστεί έχετε μετακινηθεί προς τα κάτω σε ένα επίπεδο, ώστε να κάνει
levelCounter++
thisLevelCounter = nextLevelCounter
nextLevelCounter = 0
Κάθε φορά που προσθέτετε ένα κόμβο παιδί στη λίστα αναζήτησης, αυξάνει nextLevelCounter. Κάθε φορά που αποθηκεύετε ένα νέο παιδί κόμβου αύξησηnextLevelCounter
Τέλος, η επαναληπτική στρατηγική εμβάθυνση σας δίνει τη sucess επίπεδο για δωρεάν (το οποίο επανάληψη βρίσκει ...) και έχει την ίδια σειρά των επιδόσεων (αν και ελαφρώς υψηλότερο πολλαπλασιαστή) και το εύρος πρώτη αναζήτησης.
Εδώ έκδοση κώδικα (ελπίζω δεν είχα χάσει κάθε έλεγχο σφάλματος):
void min_leaf(node_t *t, int *min, int lev, node_t **n) {
if (!t) {
return;
}
if (lev > *min) {
printf("Back from %d at lev %d, min: %d already found\n",
t->key,
lev,
*min);
return;
}
if (!t->left && !t->right) {
if (*min > lev) {
*min = lev;
*n = t;
}
} else {
min_leaf(t->left, min, lev+1, n);
min_leaf(t->right, min, lev+1, n);
}
}
void bst_print_min_leaf(bst_t* bst) {
int min = 10000; /* Replace it with some really large number */
node_t *minn = NULL;
min_leaf(bst->root, &min, 0, &minn); /*level: root is level 0 */
if (minn) printf("min leaf is at depth: %d: (%p:%d)\n", min, minn, minn->key);
}













