'use strict'

/**
 * Definition for binary tree
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */

function TreeNode(val) {
    this.val = val
    this.left = this.right = null
}

/**
 * @constructor
 * @param {TreeNode} root - root of the binary search tree
 */
var BSTIterator = function (root) {
    const stack = []
    this.array = []
    let curr = root
    while (stack.length !== 0 || curr !== null) {
        while (curr !== null) {
            stack.push(curr)
            curr = curr.left
        }
        if (stack.length !== 0) {
            curr = stack.pop()
            this.array.push(curr.val)
            curr = curr.right
        }
    }
}

/**
 * @this BSTIterator
 * @returns {boolean} - whether we have a next smallest number
 */
BSTIterator.prototype.hasNext = function () {
    return this.array.length !== 0
}

/**
 * @this BSTIterator
 * @returns {number} - the next smallest number
 */
BSTIterator.prototype.next = function () {
    return this.array.shift()
}

/**
 * Your BSTIterator will be called like this:
 * var i = new BSTIterator(root), a = [];
 * while (i.hasNext()) a.push(i.next());
 */

function __main__() {
    /* eslint no-console: ["error", {"allow": ["log"]}] */
    const logger = console.log.bind(console)
    //       1
    //      / \
    //     2   3
    //    /    /\
    //   4    6  7
    const n7 = new TreeNode(7)
    const n6 = new TreeNode(6)
    const n4 = new TreeNode(4)
    const n3 = new TreeNode(3)
    n3.left = n6
    n3.right = n7
    const n2 = new TreeNode(2)
    n2.left = n4
    const n1 = new TreeNode(1)
    n1.left = n2
    n1.right = n3
    const i = new BSTIterator(n1)
    const a = []
    while (i.hasNext()) {
        a.push(i.next())
    }
    logger(a)
}

__main__()