版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/musechipin/article/details/84751060
注意是二叉查找树,意味着左子树<根<右子树,因此,如果没有特殊要求,只需要中序遍历树,将每个结点存储即可。
但是题目要求空间复杂度为O(h),h是二叉查找树的深度,因此考虑每次只放一部分树的结点入栈。首先我们知道根的左子树的左子树的左子树...一直到最左的左子树L一定是最小值,那么先把这部分压入栈,栈顶元素L就是最小值。而下一个最小值,有可能是这个结点的右子树(根L->right,或者根的左子树L->right->.....left),那么把这部分压入栈中;如果没有的话就向上找L->father(树的结构里没有这个值但是栈中已经保存了)。
图形解释可以看这篇博客。
class BSTIterator {
public:
stack<TreeNode *> s;
BSTIterator(TreeNode *root) {
while(root!=NULL)
{
s.push(root);
root=root->left;
}
}
bool hasNext() {
if (s.empty()) return false;
else return true;
}
int next() {
TreeNode * res=s.top();
s.pop();
TreeNode * tmp=res->right;
while (tmp!=NULL)
{
s.push(tmp);
tmp=tmp->left;
}
return res->val;
}
};
- 还有要求空间复杂度为O(1)的,我想可以参考Morris算法。Morris算法主要利用了叶子节点的左右子树均为空的特性,构建一个从叶子到根的回路来代替栈。