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