Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the root node of a BST.javascript
Calling next()
will return the next smallest number in the BST.java
Example:node
BSTIterator iterator = new BSTIterator(root); iterator.next(); // return 3 iterator.next(); // return 7 iterator.hasNext(); // return true iterator.next(); // return 9 iterator.hasNext(); // return true iterator.next(); // return 15 iterator.hasNext(); // return true iterator.next(); // return 20 iterator.hasNext(); // return false
Note:this
next()
and hasNext()
should run in average O(1) time and uses O(h) memory, where h is the height of the tree.next()
call will always be valid, that is, there will be at least a next smallest number in the BST when next()
is called.实现一个BST迭代器,要求next()和hasNext()的平均时间复杂度为\(O(1)\)且空间复杂度为\(O(h)\)。spa
若是没有复杂度限制,那么最简单的方法就是先一遍中序遍历将全部值记录下来,调用next()时挨个返回就行。空间复杂度为\(O(h)\),作法就参考中序遍历的迭代实现:初始化时先将最左侧的边存储下来,每次调用next()时,栈顶元素就是下一个应返回的结点,出栈后将该结点右子树的最左侧边存入栈。重复上述过程,栈中元素数量最大为树高,且查询平均复杂度为\(O(1)\)。prototype
class BSTIterator { private Deque<TreeNode> stack; private int index; public BSTIterator(TreeNode root) { stack = new ArrayDeque<>(); while (root != null) { stack.push(root); root = root.left; } } /** * @return the next smallest number */ public int next() { TreeNode node = stack.pop(); TreeNode tmp = node.right; while (tmp != null) { stack.push(tmp); tmp = tmp.left; } return node.val; } /** * @return whether we have a next smallest number */ public boolean hasNext() { return !stack.isEmpty(); } }
/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } */ /** * @param {TreeNode} root */ var BSTIterator = function (root) { this.stack = [] while (root) { this.stack.push(root) root = root.left } } /** * @return {number} */ BSTIterator.prototype.next = function () { let top = this.stack.pop() let p = top.right while (p) { this.stack.push(p) p = p.left } return top.val } /** * @return {boolean} */ BSTIterator.prototype.hasNext = function () { return this.stack.length }