173. 二叉搜索树迭代器
实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。
调用 next() 将返回二叉搜索树中的下一个最小的数。
解题思路: 我们可以用一个数组提前按照中序遍历的方式把二叉树的节点保存下来,然后,在next的迭代过程中只需要维护一个游标,即可解题,当然此题这么解,那难度应该标记为easy,难度标记为medium也是有道理的,因为题目提出要求,时间复杂度为 O ( 1 ) O(1) O(1),空间复杂度为 O ( h ) O(h) O(h),初步判断应该是要用树的非递归解法。
- Space complexity:O(n)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class BSTIterator {
public:
BSTIterator(TreeNode* root) {
dfs(root);
pos = 0;
}
/** @return the next smallest number */
int next() {
return data[pos++]->val;
}
/** @return whether we have a next smallest number */
bool hasNext() {
return pos < data.size();
}
private:
void dfs(TreeNode* root) {
if (!root) return;
dfs(root->left);
data.push_back(root);
dfs(root->right);
}
vector<TreeNode*> data;
int pos;
};
/**
* Your BSTIterator object will be instantiated and called as such:
* BSTIterator* obj = new BSTIterator(root);
* int param_1 = obj->next();
* bool param_2 = obj->hasNext();
*/
根据空间复杂度为 O ( h ) O(h) O(h)的要求,基本推断需要用中序的非递归遍历解题,下面相当于是对之前做过的中序遍历的非递归写法的微调和改写。另外我也浏览了一下,自己的解法与grandyang的解法大致相同,把grandyang的解法也贴出来一下。
[LeetCode] Binary Search Tree Iterator 二叉搜索树迭代器
- Space complexity:O(h)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class BSTIterator {
public:
BSTIterator(TreeNode* root) {
p = root;
}
/** @return the next smallest number */
int next() {
while (p) {
st.push(p);
p = p->left;
}
p = st.top(); st.pop();
int res = p->val;
p = p->right;
return res;
}
/** @return whether we have a next smallest number */
bool hasNext() {
return p || !st.empty();
}
private:
stack<TreeNode*> st;
TreeNode *p;
};
/**
* Your BSTIterator object will be instantiated and called as such:
* BSTIterator* obj = new BSTIterator(root);
* int param_1 = obj->next();
* bool param_2 = obj->hasNext();
*/