使用堆栈来获取BST的高度

using a stack to get the height of a BST

本文关键字:BST 高度 获取 堆栈      更新时间:2023-10-16

我试图使用堆栈获得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;

}

部分节点的堆栈大小深度值不正确。如。如果当前节点是其他节点的右子节点,则堆栈不包含该其他节点(父节点)。对于树中最右边的节点,堆栈将不包含任何项。

你必须正确地计算深度。在你的例子中,你可能会在一次弹出中上升更多的级别,所以减去一个将不起作用,但如果你将当前深度保存到堆栈中(并在弹出时恢复它),它将起作用。

要做到这一点,您应该将堆栈定义更改为eg.
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)