mirror of
https://gitlab.com/mfocko/LeetCode.git
synced 2024-11-09 15:59:06 +01:00
problems: add BST iterator
Signed-off-by: Matej Focko <mfocko@redhat.com>
This commit is contained in:
parent
826b402dd1
commit
aad7d85fd2
1 changed files with 88 additions and 0 deletions
88
problems/binary-search-tree-iterator.java
Normal file
88
problems/binary-search-tree-iterator.java
Normal file
|
@ -0,0 +1,88 @@
|
|||
import java.util.ArrayDeque;
|
||||
|
||||
/* *
|
||||
* Definition for a binary tree node.
|
||||
* public class TreeNode {
|
||||
* int val;
|
||||
* TreeNode left;
|
||||
* TreeNode right;
|
||||
* TreeNode() {}
|
||||
* TreeNode(int val) { this.val = val; }
|
||||
* TreeNode(int val, TreeNode left, TreeNode right) {
|
||||
* this.val = val;
|
||||
* this.left = left;
|
||||
* this.right = right;
|
||||
* }
|
||||
* }
|
||||
*/
|
||||
|
||||
class TreeNode {
|
||||
int val;
|
||||
TreeNode left;
|
||||
TreeNode right;
|
||||
TreeNode() {}
|
||||
TreeNode(int val) { this.val = val; }
|
||||
TreeNode(int val, TreeNode left, TreeNode right) {
|
||||
this.val = val;
|
||||
this.left = left;
|
||||
this.right = right;
|
||||
}
|
||||
}
|
||||
|
||||
class BSTIterator {
|
||||
private enum Position {
|
||||
Todo, Done
|
||||
}
|
||||
|
||||
private class Entry {
|
||||
public TreeNode node;
|
||||
public Position position;
|
||||
|
||||
public Entry(TreeNode node, Position position) {
|
||||
this.node = node;
|
||||
this.position = position;
|
||||
}
|
||||
|
||||
public void expand(ArrayDeque<Entry> stack) {
|
||||
if (node.right != null) {
|
||||
stack.addLast(new Entry(node.right, Position.Todo));
|
||||
}
|
||||
|
||||
this.position = Position.Done;
|
||||
stack.addLast(this);
|
||||
|
||||
if (node.left != null) {
|
||||
stack.addLast(new Entry(node.left, Position.Todo));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private ArrayDeque<Entry> stack = new ArrayDeque<>();
|
||||
public BSTIterator(TreeNode root) {
|
||||
stack.addLast(new Entry(root, Position.Todo));
|
||||
}
|
||||
|
||||
public int next() {
|
||||
for (
|
||||
Entry last = stack.getLast();
|
||||
last != null && last.position == Position.Todo;
|
||||
last = stack.getLast()
|
||||
) {
|
||||
stack.removeLast().expand(stack);
|
||||
}
|
||||
|
||||
return stack.removeLast().node.val;
|
||||
}
|
||||
|
||||
public boolean hasNext() {
|
||||
Entry last = stack.peekLast();
|
||||
return last != null && (last.position != Position.Todo || last.node != null);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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();
|
||||
*/
|
Loading…
Reference in a new issue