используя стек, чтобы получить высоту 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<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