Every day a Leetcode
题目来源:173. 二叉搜索树迭代器
解法1:中序遍历
我们可以直接对二叉搜索树做一次完全的递归遍历,获取中序遍历的全部结果并保存在数组中。随后,我们利用得到的数组本身来实现迭代器。
代码:
/** @lc app=leetcode.cn id=173 lang=cpp** [173] 二叉搜索树迭代器*/// @lc code=start
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class BSTIterator
{
private:int index = 0;vector<int> nums;// 辅函数void inOrder(TreeNode *root, vector<int> &nums){if (root == nullptr)return;inOrder(root->left, nums);nums.push_back(root->val);inOrder(root->right, nums);}// 中序遍历vector<int> inOrderTraversal(TreeNode *root){vector<int> res;inOrder(root, res);return res;}public:BSTIterator(TreeNode *root) : index(0), nums(inOrderTraversal(root)){}int next(){int num = nums[index];index++;return num;}bool hasNext(){return (index < nums.size());}
};/*** 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();*/
// @lc code=end
结果:
复杂度分析:
时间复杂度:初始化需要 O(n) 的时间,其中 n 为树中节点的数量。随后每次调用只需要 O(1) 的时间。
空间复杂度:O(n),因为需要保存中序遍历的全部结果。
解法2:迭代
除了递归的方法外,我们还可以利用栈这一数据结构,通过迭代的方式对二叉树做中序遍历。此时,我们无需预先计算出中序遍历的全部结果,只需要实时维护当前栈的情况即可。
代码:
class BSTIterator {
private:TreeNode* cur;stack<TreeNode*> stk;
public:BSTIterator(TreeNode* root): cur(root) {}int next() {while (cur != nullptr) {stk.push(cur);cur = cur->left;}cur = stk.top();stk.pop();int ret = cur->val;cur = cur->right;return ret;}bool hasNext() {return cur != nullptr || !stk.empty();}
};
结果:
复杂度分析: