使用堆栈来获得BST的高度

时间:2011-09-14 15:44:53

标签: c++ stack binary-search-tree

我正在尝试使用堆栈获取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;

}

1 个答案:

答案 0 :(得分: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