题目链接: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;
}
}