题目:
实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。
调用 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 中至少存在一个下一个最小的数。
思路:网上百度了大神的代码,原文链接如下:https://blog.csdn.net/smile_watermelon/article/details/47280679
代码:比较简单的想法就是把整个二叉树按照从大到小的顺序排序,将其一次放入栈中,然后使用next取出。但是这样的话不符合空间复杂度为O(h)的要求。还是用一个栈保存元素,与上面不同的是,初始化元素时,将根节点,和之后的左节点一直到最后的叶子结点全部放入到栈中。next()时,取出栈中的元素,将取出节点的右节点和它的左节点直到叶子结点加入栈中。
我自己再做这个题还是有点理解不了是怎么做的。我刚开始自己想的是使用中序遍历,但是使用数组的话空间复杂度不对。
class BSTIterator {
private Stack <TreeNode>mins=new Stack<>();
public BSTIterator(TreeNode root) {
TreeNode current=root;
while(current!=null){
mins.push(current);
current=current.left;
}
}
/** @return the next smallest number */
public int next() {
TreeNode temp = mins.pop();
int ret=temp.val;
TreeNode current=temp.right;
while(current!=null)
{
mins.push(current);
current=current.left;
}
return ret;
}
/** @return whether we have a next smallest number */
public boolean hasNext() {
return !mins.empty();
}
}
提交最多的代码:
这部分代码和上面代码的思路是一样的只不过实现方式不同。
public class BSTIterator {
List<TreeNode> list=new ArrayList<TreeNode>();
public BSTIterator(TreeNode root) {
if(root!=null){
list.add(root);
}
while(list.size()>0){
TreeNode node=list.get(list.size()-1);
if(node.left!=null){
list.add(node.left);
node.left=null;
}else{
break;
}
}
}
/** @return whether we have a next smallest number */
public boolean hasNext() {
return list.size()!=0;
}
/** @return the next smallest number */
public int next() {
TreeNode test=list.get(list.size()-1);
list.remove(list.size()-1);
if(test.right!=null){
list.add(test.right);
while(true){
TreeNode node=list.get(list.size()-1);
if(node.left!=null){
list.add(node.left);
node.left=null;
}else {
break;
}
}
}
return test.val;
}
}