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.
思路
整体思路就是对BST进行前序遍历即可。此题重点在于设计和实现,我们在前序遍历的时候利用栈来进行,避免采用递归的方式。
需要注意利用栈的时候,C++必须利用top()函数来取栈顶的值,而不能用pop()。一定要注意pop()所在的位置。也一定要注意是否会有内存的溢出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class BSTIterator { private: stack<TreeNode*> DFS; public: BSTIterator(TreeNode *root) { while(root != NULL){ DFS.push(root); root = root->left; } } bool hasNext() { if (DFS.empty()) return false; else return true; } int next() { TreeNode *cur = DFS.top(); DFS.pop(); if(cur != NULL) { if(cur->right != NULL){ TreeNode *tmp = cur->right; while(tmp != NULL){ DFS.push(tmp); tmp = tmp->left; } } return cur->val; } else return 0; } }; * Your BSTIterator will be called like this: * BSTIterator i = BSTIterator(root); * while (i.hasNext()) cout << i.next(); */
|