utilizando una pila para obtener la altura de una BST

votos
0

Estoy tratando de obtener la altura de un BST usando una pila. Me dijeron que debo utilizar preorden y medir encuentra el mayor tamaño de la pila. Sin embargo, esto no parece funcionar. ¿Alguna idea de lo que estoy haciendo 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;

}

Publicado el 14/09/2011 a las 16:44
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
1

El tamaño de la pila es valor incorrecto de la profundidad para algunos nodos. P.ej. si el nodo actual es un hijo derecho de otro nodo, la pila no contiene este otro nodo (nuestro padre). Para el nodo más acertada en el árbol, la pila tendrá ningún elemento.

Vas a tener que calcular la profundidad correcta. En su caso, puede subir más niveles en un solo estallido, por lo que resta de uno no va a funcionar, pero si guarda su profundidad actual de la pila (y lo restaura mientras prepara palomitas), se ponga a funcionar.

Para hacer eso, usted debe cambiar su definición de pila a, por ejemplo.

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

y añadir una variable current_depth.

Para cada " nodePtr=nodeptr->left/right", incrementas current_depth. empuje con

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

y antes de que el pop, restaurar current_depthcon

current_depth = s.top().second;

(El puntero de nodo es, obviamente, en .first)

Respondida el 14/09/2011 a las 17:04
fuente por usuario

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