Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the root node of a BST.
Calling next()
will return the next smallest number in the BST.
Note: next()
and hasNext()
should run in average O(1) time and uses O(h) memory, where h is the height of the tree.
Credits:
Special thanks to @ts for adding this problem and creating all test cases.
Subscribe to see which companies asked this question
分析:
感觉蛮简单的!就是一个中序遍历嘛!可能想的太简单了!
next()和hasnext()函数的空间复杂度为O(1),时间复杂度为O(1),这里并没有符合要求。
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class BSTIterator { public: BSTIterator(TreeNode *root) { inorderTraversal(root);//获取中序遍历结果 pos=0; } void inorderTraversal(TreeNode* root) { if(root){ inorderTraversal(root->left); result.push_back(root->val); inorderTraversal(root->right); } } /** @return whether we have a next smallest number */ bool hasNext() { return pos < result.size(); } /** @return the next smallest number */ int next() { return result[pos++]; } private: vector<int> result; int pos; }; /** * Your BSTIterator will be called like this: * BSTIterator i = BSTIterator(root); * while (i.hasNext()) cout << i.next(); */
别人的算法设计:
class BSTIterator { public: BSTIterator(TreeNode *root) { pushLeft(root); } /** @return whether we have a next smallest number */ bool hasNext() { return !stk.empty(); } /** @return the next smallest number */ int next() {//空间复杂度为O(h),时间复杂度为O(h) TreeNode *tmpNode = stk.top(); stk.pop(); pushLeft(tmpNode->right); return tmpNode->val; } void pushLeft(TreeNode *node) {//空间复杂度为O(h),时间复杂度为O(h) while (node != NULL) { stk.push(node); node = node->left; } } private: stack<TreeNode *> stk; };
注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!
原文地址:http://blog.csdn.net/ebowtang/article/details/51660101
原作者博客:http://blog.csdn.net/ebowtang
本博客LeetCode题解索引:http://blog.csdn.net/ebowtang/article/details/50668895