二叉搜索树迭代器
什么是二叉搜索树迭代器
调用 next() 将返回二叉搜索树中的下一个最小的数。
如图:
这里我们next和hasNext()的操作的时间复杂度为O(1)
我解决这个问题的思路:
1.我们首先让所有的左孩子全部入栈
如图:7,3
2.然后我们在next方法里开始弹栈
如果该节点有右子树那么我们假设temp=node.right
然后让temp和temp的左子树全部入栈
最后返回node.value就可以了
如图:3弹栈 3没有右子树直接返回3
7弹栈 7有右子树让15,9入栈 9没有左子树 返回7
9出栈 9没有右子树 返回 9
15出栈 15有右子树 20入栈 20没有左子树 返回 15
最后20出栈 20没有右子树 返回 20
3.我们的hasNext很简单只要判断栈是否为空就可以了
上代码:
import java.util.Arrays;
class BSTIterator {
// int[] array;
// int index;
Stack<TreeNode> stack=new Stack();
public BSTIterator(TreeNode root) {
//放在构造方法里为了保证O(1)的时间复杂度
while(root!=null){
stack.push(root);
root=root.left;
}
}
/** @return the next smallest number */
//获取下一个最小的数
public int next() {
TreeNode node=stack.pop();//弹栈
if(node.right!=null){//如果右子树不为空
TreeNode temp=node.right;
while(temp!=null){//将右子树和它的左子树的左孩子进栈
stack.push(temp);
temp=temp.left;
}
}
return node.val;//返回弹栈元素
}
/** @return whether we have a next smallest number */
//判断是否有下一个最小的数字
public boolean hasNext() {
if(stack.isEmpty()){//如果没有下一个元素返回false
return false;
}
return true;
}
}