z wykorzystaniem stosu, aby uzyskać wysokość do BST

głosy
0

Próbuję uzyskać wysokość o BST wykorzystaniem stosu. Powiedziano mi, że powinienem użyć zamĂłwienia przedpremierowego i zmierzyć znaleźć największy rozmiar stosu. Jednak to nie wydają się działać. Wszelkie pomysły, co robię źle.

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;

}

Utwórz 14/09/2011 o 16:44
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
1

Rozmiar stosu jest niepoprawna wartość głębokości dla niektórych węzłach. Na przykład. jeżeli bieżący węzeł jest prawo dziecka z innego węzła, stos nie zawiera tego innego węzła (nasza dominująca). Dla rightest węzła w drzewie, stos będzie miał żadnych przedmiotów.

Musisz poprawnie obliczyć głębię. W twoim przypadku może wzrosnąć więcej poziomów w jednym pop, więc odejmując jeden nie będzie działać, ale jeśli zapisać aktualną głębokość do stosu (i przywrócić go podczas popping), to będzie działać.

Aby to zrobić, należy zmienić definicję stosu, aby np.

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

i dodać zmienną current_depth.

Dla każdego „ nodePtr=nodeptr->left/right”, to przyrost current_depth. pchania z

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

i zanim się pojawi, należy przywrócić current_depthz

current_depth = s.top().second;

(Wskaźnik węzeł jest oczywiście w .first)

Odpowiedział 14/09/2011 o 17:04
źródło użytkownik

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