--- tags: leetcode --- # [173. Binary Search Tree Iterator](https://leetcode.com/problems/binary-search-tree-iterator/) --- # My Solution ## Solution 1 ### The Key Idea for Solving This Coding Question Use DFS (recursion) to flatten all the node values into an array. ### C++ Code ```cpp= /** * 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 { public: BSTIterator(TreeNode *root) : idx(0) { dfs(root); } bool hasNext() { return idx < inorder.size(); } int next() { return inorder[idx++]; } private: vector<int> inorder; int idx; void dfs(TreeNode *root) { if (root == nullptr) { return; } dfs(root->left); inorder.push_back(root->val); dfs(root->right); } }; /** * 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(); */ ``` ### Time Complexity: * `BSTIterator` $O(n)$ $n$ is the number of nodes in BST. * `hasNext` $O(1)$ * `next` $O(1)$ ### Space Complexity: * `BSTIterator` $O(H)$ $H$ is the height of the BST. * `hasNext` $O(1)$ * `next` $O(1)$ ## Solution 2 ### The Key Idea for Solving This Coding Question Use DFS (iteration with stack) to partitially traverse the BST. ### C++ Code ```cpp= /** * 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 { public: BSTIterator(TreeNode *root) { dfs(root); } bool hasNext() { return !st.empty(); } int next() { TreeNode *node = st.top(); st.pop(); dfs(node->right); return node->val; } private: stack<TreeNode *> st; void dfs(TreeNode *root) { while(root != nullptr) { st.push(root); root = root->left; } } }; /** * 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(); */ ``` ### Time Complexity: * `BSTIterator` $O(H)$ $H$ is the height of the BST. * `hasNext` $O(1)$ * `next` $O(H)$ ### Space Complexity: * `BSTIterator` $O(H)$ * `hasNext` $O(1)$ * `next` $O(H)$ ## Solution 3 ### The Key Idea for Solving This Coding Question Convert BST to a sorted linked list by Morris Traversal. ### C++ Code ```cpp= /** * 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 { public: BSTIterator(TreeNode *root) : head(nullptr) { dfs(root); } bool hasNext() { return head != nullptr; } int next() { int rev = head->val; head = head->right; return rev; } private: TreeNode *head; void dfs(TreeNode *root) { TreeNode *predecessor = nullptr; while (root != nullptr) { if (root->left == nullptr) { if (head == nullptr) { head = root; } predecessor = root; root = root->right; } else { TreeNode *node = root->left; while (node->right != nullptr && node->right != root) { node = node->right; } if (node->right == nullptr) { node->right = root; TreeNode *x = root; root = root->left; x->left = nullptr; if (predecessor != nullptr) { predecessor->right = root; } } // else { // // In morris traversal, this else-branch is for restoring // // the tree structure. However, we need to keep root->right // // pointing to root's successor, so this branch is not used. // // Also, the left pointer of root's successor has been set // // to nullptr, so this branch won't be run. // root = root->right; // node->right = nullptr; //} } } // end of while-loop } }; /** * 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(); */ ``` ### Time Complexity: * `BSTIterator` $O(n)$ $n$ is the number of nodes in BST. * `hasNext`: $O(1)$ * `next` $O(1)$ ### Space Complexity: * `BSTIterator` $O(1)$ * `hasNext` $O(1)$ * `next` $O(1)$ # Miscellaneous <!-- # Test Cases ``` ["BSTIterator","next","next","hasNext","next","hasNext","next","hasNext","next","hasNext"] [[[7,3,15,null,null,9,20]],[],[],[],[],[],[],[],[],[]] ``` * Wrong Answer ``` ["BSTIterator","hasNext","next","hasNext"] [[[1]],[],[],[]] ``` * Runtime Error ``` ["BSTIterator","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext","next","hasNext"] [[[41,37,44,24,39,42,48,1,35,38,40,null,43,46,49,0,2,30,36,null,null,null,null,null,null,45,47,null,null,null,null,null,4,29,32,null,null,null,null,null,null,3,9,26,null,31,34,null,null,7,11,25,27,null,null,33,null,6,8,10,16,null,null,null,28,null,null,5,null,null,null,null,null,15,19,null,null,null,null,12,null,18,20,null,13,17,null,null,22,null,14,null,null,21,23]],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]] ``` -->