实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器:
    BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在于 BST 中的数字,且该数字小于 BST 中的任何元素。
    boolean hasNext() 如果向指针右侧遍历存在数字,则返回 true ;否则返回 false 。
    int next()将指针向右移动,然后返回指针处的数字。
    注意,指针初始化为一个不存在于 BST 中的数字,所以对 next() 的首次调用将返回 BST 中的最小元素。

    你可以假设 next() 调用总是有效的,也就是说,当调用 next() 时,BST 的中序遍历中至少存在一个下一个数字。

    示例:

    image.png
    输入
    [“BSTIterator”, “next”, “next”, “hasNext”, “next”, “hasNext”, “next”, “hasNext”, “next”, “hasNext”]
    [[[7, 3, 15, null, null, 9, 20]], [], [], [], [], [], [], [], [], []]
    输出
    [null, 3, 7, true, 9, true, 15, true, 20, false]

    解释
    BSTIterator bSTIterator = new BSTIterator([7, 3, 15, null, null, 9, 20]);
    bSTIterator.next(); // 返回 3
    bSTIterator.next(); // 返回 7
    bSTIterator.hasNext(); // 返回 True
    bSTIterator.next(); // 返回 9
    bSTIterator.hasNext(); // 返回 True
    bSTIterator.next(); // 返回 15
    bSTIterator.hasNext(); // 返回 True
    bSTIterator.next(); // 返回 20
    bSTIterator.hasNext(); // 返回 False

    1. /**
    2. * Definition for a binary tree node.
    3. * function TreeNode(val, left, right) {
    4. * this.val = (val===undefined ? 0 : val)
    5. * this.left = (left===undefined ? null : left)
    6. * this.right = (right===undefined ? null : right)
    7. * }
    8. */
    9. /**
    10. * @param {TreeNode} root
    11. */
    12. var BSTIterator = function (root) {
    13. this.stack = [];
    14. this.index = 0;
    15. this.inorderTraversal(root, this.stack);
    16. };
    17. /**
    18. * @return {number}
    19. */
    20. BSTIterator.prototype.next = function () {
    21. return this.stack[this.index++];
    22. };
    23. /**
    24. * @return {boolean}
    25. */
    26. BSTIterator.prototype.hasNext = function () {
    27. return this.index < this.stack.length;
    28. };
    29. /**
    30. * Your BSTIterator object will be instantiated and called as such:
    31. * var obj = new BSTIterator(root)
    32. * var param_1 = obj.next()
    33. * var param_2 = obj.hasNext()
    34. */
    35. BSTIterator.prototype.inorderTraversal = function(root, arr) {
    36. if (!root) {
    37. return;
    38. }
    39. this.inorderTraversal(root.left, arr);
    40. arr.push(root.val);
    41. this.inorderTraversal(root.right, arr);
    42. };

    image.png