à l'aide d'une pile pour obtenir la hauteur d'un BST

voix
0

Je suis en train d'obtenir la hauteur d'un BST à l'aide d'une pile. On m'a dit que je devrais utiliser précommande et mesurer trouver la plus grande taille de la pile. Toutefois, cela ne semble pas fonctionner. Toutes les idées de ce que je fais mal.

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;

}

Créé 14/09/2011 à 16:44
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
1

La taille de la pile est incorrect valeur de profondeur de certains noeuds. Par exemple. si le nœud actuel est un enfant droit d'un autre nœud, la pile ne contient pas cet autre noeud (notre parent). Pour le nœud dans l'arbre la plus juste, la pile aura aucun élément.

Vous devrez calculer la profondeur correctement. Dans votre cas, vous pouvez aller jusqu'à plus de niveaux dans un pop, donc soustrait un ne fonctionnera pas, mais si vous enregistrez votre profondeur actuelle de la pile (et de restaurer tout en popping), cela fonctionnera.

Pour ce faire, vous devez changer votre définition de la pile à par exemple.

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

et ajouter une variable current_depth.

Pour chaque « nodePtr=nodeptr->left/right», vous incrémenter current_depth. Poussez avec

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

et avant que vous pop, restaurer current_depthavec

current_depth = s.top().second;

(Le pointeur de noeud est évidemment .first)

Créé 14/09/2011 à 17:04
source utilisateur

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