题目
代码框架:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class BSTIterator {
public BSTIterator(TreeNode root) {
}
public int next() {
}
public boolean hasNext() {
}
}
/**
* Your BSTIterator object will be instantiated and called as such:
* BSTIterator obj = new BSTIterator(root);
* int param_1 = obj.next();
* boolean param_2 = obj.hasNext();
*/
求解
思路:这题类似于让我们用一个集合类来实现一个迭代器,且输入的数据是一棵二叉树(根节点)。题目中的提示中说:hasNext()和next()的时间复杂度是O(1),且使用O(h)内存,这不就正好可以使用一个栈来实现吗?使用深度为h的栈就可以存储所有的信息了,并且栈的弹栈操作时间复杂度是O(1),满足题目要求。我们需要用一个栈来实现迭代器。每次都要取出最小的一个值,且不能重复,可以通过得到最左侧的节点来实现。
栈操作:输入一个根节点,通过根节点把树的左侧所有节点存入栈,这些存入栈的节点对应的值小于其右子树的所有节点,且右子树的所有节点的值都小于下一个堆栈元素。取出的左侧一排可以类似于对于全部有序结果的一种抽样。当调用了next时,弹出栈顶元素,若它没有右子树,那么直接返回它就可以了;若它有右子树,那么不仅需要返回这个值,还需要把它的右子节点以及右子节点的所有左子节点压栈。后续操作就一样了。
完整代码:
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
class BSTIterator {
Stack<TreeNode> integers=new Stack<>();
public BSTIterator(TreeNode root) {
TreeNode treeNode=root;;
while(treeNode!=null){
integers.push(treeNode);
treeNode=treeNode.left;
}
}
public int next() {
TreeNode treeNode=integers.pop();
TreeNode treeRight=treeNode.right;
while(treeRight!=null){
integers.push(treeRight);
treeRight=treeRight.left;
}
return treeNode.val;
}
public boolean hasNext() {
return !integers.isEmpty();
}
}