χρησιμοποιώντας μια στοίβα για να πάρει το ύψος της BST

ψήφοι
0

Είμαι προσπαθεί να πάρει το ύψος της BST χρησιμοποιώντας μια στοίβα. Μου είπαν ότι θα πρέπει να χρησιμοποιούν προ-παραγγελία και μέτρηση βρείτε το μεγαλύτερο μέγεθος της στοίβας. Ωστόσο, αυτό δεν φαίνεται να λειτουργεί. Οποιεσδήποτε ιδέες για το τι κάνω λάθος.

int PBT::maxDepth() {
if (!root) {
    return -1;
}
int depth=0;
stack<TreeNode *>s;
TreeNode * nodePtr=root;
for (; ; ) {        
    while (nodePtr) {
        s.push(nodePtr);
        if (s.size() > depth)
            depth = s.size();
        nodePtr=nodePtr->left;
    }if (s.empty()) {
        break;
    }
    nodePtr=s.top();
    s.pop();
    nodePtr=nodePtr->right;
}
return depth;

}

Δημοσιεύθηκε 14/09/2011 στις 16:44
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
1

Το μέγεθος του stack είναι εσφαλμένη τιμή του βάθους για ορισμένους κόμβους. Π.χ. αν ο τρέχων κόμβος είναι ένα δικαίωμα το παιδί του άλλου κόμβου, η στοίβα δεν περιέχει αυτό το άλλο κόμβο (μητρική μας). Για την rightest κόμβο στο δέντρο, η στοίβα θα υπάρχουν προϊόντα.

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

Για να το κάνετε αυτό, θα πρέπει να αλλάξετε τον ορισμό stack σας, π.χ..

stack<pair<TreeNode*, unsigned> > stack;

και προσθέστε μια μεταβλητή current_depth.

Για κάθε « nodePtr=nodeptr->left/right», θα αυξήσετε current_depth. Σπρώξτε με

s.push(make_pair(nodeptr, current_depth));

και πριν από την ποπ, την αποκατάσταση current_depthμε

current_depth = s.top().second;

(Ο δείκτης κόμβος είναι προφανώς σε .first)

Απαντήθηκε 14/09/2011 στις 17:04
πηγή χρήστη

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