Leetcode173. 二叉搜索树迭代器

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

结果:

Leetcode173. 二叉搜索树迭代器_第1张图片

复杂度分析:

时间复杂度:初始化需要 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();
    }
};

结果:

Leetcode173. 二叉搜索树迭代器_第2张图片

复杂度分析:

Leetcode173. 二叉搜索树迭代器_第3张图片

你可能感兴趣的:(Every,day,a,leetcode,leetcode,算法,C++,数据结构与算法)