# 【Leetcode】Binary Search Tree Iterator

271人阅读 评论(0)

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)。

	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();
}
}

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;
}
}

个人资料
等级：
访问量： 57万+
积分： 8683
排名： 2738
博客专栏
 Leetcode题解java版 文章：289篇 阅读：494727
最新评论