题目:
题解:
本题规定了时间复杂度为O(h)而不是为O(n),所以我们用栈模拟中序遍历过程,将二叉排序树的左节点存入栈中,栈顶元素即为最小值。空间复杂度为O(1),直接返回栈顶元素就可以了。
思路:
仅仅将中序遍历最小值之前的节点压入栈中,当next时我们将栈顶元素取出即为最小值返回,当然在此之前需要将下一个最小值找到,并将路径上的所有节点压入栈中以供使用,查看是否迭代到头只需判断栈是否为空即可。
代码如下:
class BSTIterator {
private:
stack<TreeNode*> record;
public:
BSTIterator(TreeNode* root) {
while(root){//中序遍历将左子树的所有左节点全部压入栈中,栈顶元素为最小值
record.push(root);
root=root->left;
}
}
/** @return the next smallest number */
int next() {
TreeNode* node=record.top();record.pop();
int result=node->val;//栈顶元素为最小值
node=node->right;//下一个最小值当然出现在node节点的右子树中
while(node)//在将最小值找到后,需要将下一个最小值找到
{
record.push(node);
node=node->left;
}
return result;
}
/** @return whether we have a next smallest number */
bool hasNext() {//判断栈是否为空即可
return !record.empty();
}
};