https://leetcode.com/problems/binary-search-tree-iterator/description/
코드설명
이진탐색트리(Binary Search Tree) + 깊이우선탐색(DFS) 를 활용합니다.
이진탐색트리의 조건으로는,
1. 각 노드는 최대 두개의 자식노드만을 가질 수 있습니다.
2. 왼쪽 자식노드값은 부모노드값보다 작아야 합니다.
3. 오른쪽 자식 노드값은 부모노드값보다 커야합니다.
이러한 조건을 통해, 탐색 시 O(log n) 안에 탐색이 가능해집니다.
문제의 입력예시와 함께 살펴보면,
BSTIterator bSTIterator = new BSTIterator([7, 3, 15, null, null, 9, 20]);
bSTIterator.next(); // return 3
bSTIterator.next(); // return 7
bSTIterator.hasNext(); // return True
bSTIterator.next(); // return 9
bSTIterator.hasNext(); // return True
bSTIterator.next(); // return 15
bSTIterator.hasNext(); // return True
bSTIterator.next(); // return 20
bSTIterator.hasNext(); // return False
1. 먼저 BSTIetartor 생성자가 실행하여, 루트에서부터 맨 왼쪽 노드까지 Stakc에 넣습니다. 이떄 pushLeft를 통해 맨 하단까지 내려간다는 점을 확인합니다.
2. next함수 실행하여 stack에서 값을 POP하고, 오른쪽 노드를 pushLeft를 통해 stack에 넣어갑니다.
주 로직은 이 2가지입니다.
코드
/**
* 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 BSTIterator {
Stack<TreeNode> st = new Stack<>();
public BSTIterator(TreeNode root) {
st.push(root);
pushLeft(root.left);
}
public int next() {
TreeNode node = st.pop();
pushLeft(node.right);
return node.val;
}
public boolean hasNext() {
return !st.isEmpty();
}
private void pushLeft(TreeNode node){
if(node != null){
st.push(node);
pushLeft(node.left);
}
}
}
/**
* 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();
*/