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();
 */

+ Recent posts