题目链接:https://leetcode.com/problems/binary-search-tree-iterator/
题目:
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.
思路:
1、BST中序遍历,遍历结果存到队列中。next不断出队。next和hasNext时间复杂度为O(1),空间复杂度为O(n)。
2、用栈保存,空间复杂度为O(h)。
算法1:
public class BSTIterator { Queue<Integer> q = null; public BSTIterator(TreeNode root) { q = new LinkedList<Integer>(); q = inOrder(root, q); } public Queue<Integer> inOrder(TreeNode p, Queue<Integer> queue) { if (p != null) { queue = inOrder(p.left, queue); queue.offer(p.val); queue = inOrder(p.right, queue); } return queue; } /** * @return whether we have a next smallest number */ public boolean hasNext() { return !q.isEmpty(); } /** * @return the next smallest number */ public int next() { return q.poll(); } }
算法2:
public class BSTIterator { Stack<TreeNode> q = null; public BSTIterator(TreeNode root) { q = new Stack<TreeNode>(); while (root != null) { q.push(root); root = root.left; } } /** * @return whether we have a next smallest number */ public boolean hasNext() { return !q.isEmpty(); } /** * @return the next smallest number */ public int next() { TreeNode t = q.pop(); TreeNode p = t.right; if (p != null) { // 如果t的右子树不为空,则入栈 q.push(p); while (p.left != null) {// 压入右子树自上而下所有最左结点 q.push(p.left); p = p.left; } } return t.val; } }