题目
实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。
调用 next() 将返回二叉搜索树中的下一个最小的数。
示例:
BSTIterator iterator = new BSTIterator(root); iterator.next(); //
返回 3 iterator.next(); // 返回 7 iterator.hasNext(); // 返回 true
iterator.next(); // 返回 9 iterator.hasNext(); // 返回 true
iterator.next(); // 返回 15 iterator.hasNext(); // 返回 true
iterator.next(); // 返回 20 iterator.hasNext(); // 返回 false提示:
next() 和 hasNext() 操作的时间复杂度是 O(1),并使用 O(h) 内存,其中 h 是树的高度。 你可以假设 next()
调用总是有效的,也就是说,当调用 next() 时,BST 中至少存在一个下一个最小的数。
解题思路
使用中序遍历,把二叉搜索树的数据存入到一个链表list中,即链表的有序的,然后每次next()返回其链表的开头元素即可。
代码如下
class BSTIterator {
LinkedList<Integer> list = new LinkedList<Integer>();
public BSTIterator(TreeNode root) {
inOrder(list, root);
}
public void inOrder(List<Integer> list, TreeNode root){
if(root == null) {
return;
}
inOrder(list, root.left);
list.add(root.val);
inOrder(list, root.right);
}
public int next() {
return list.pollFirst();
}
public boolean hasNext() {
return list.size() > 0;
}
}
提交结果
成功
显示详情
执行用时 : 95 ms, 在Binary Search Tree Iterator的Java提交中击败了97.48% 的用户
内存消耗 : 49.2 MB, 在Binary Search Tree Iterator的Java提交中击败了99.47% 的用户