LeetCode in TypeScript

173. Binary Search Tree Iterator

Medium

Implement the BSTIterator class that represents an iterator over the in-order traversal of a binary search tree (BST):

Notice that by initializing the pointer to a non-existent smallest number, the first call to next() will return the smallest element in the BST.

You may assume that next() calls will always be valid. That is, there will be at least a next number in the in-order traversal when next() is called.

Example 1:

Input [“BSTIterator”, “next”, “next”, “hasNext”, “next”, “hasNext”, “next”, “hasNext”, “next”, “hasNext”] [[[7, 3, 15, null, null, 9, 20]], [], [], [], [], [], [], [], [], []]

Output: [null, 3, 7, true, 9, true, 15, true, 20, false]

Explanation:

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 

Constraints:

Follow up:

Solution

import { TreeNode } from '../../com_github_leetcode/treenode'

/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */
class BSTIterator {
    private node: TreeNode | null

    constructor(root: TreeNode | null) {
        this.node = root
    }

    next(): number {
        let res = -1
        while (this.node !== null) {
            if (this.node.left !== null) {
                let rightMost = this.node.left
                while (rightMost.right !== null && rightMost.right !== this.node) {
                    rightMost = rightMost.right
                }

                if (rightMost.right === null) {
                    rightMost.right = this.node
                    this.node = this.node.left
                } else {
                    rightMost.right = null
                    res = this.node.val
                    this.node = this.node.right
                    return res
                }
            } else {
                res = this.node.val
                this.node = this.node.right
                return res
            }
        }
        return res
    }

    hasNext(): boolean {
        return this.node !== null
    }
}

/**
 * Your BSTIterator object will be instantiated and called as such:
 * var obj = new BSTIterator(root)
 * var param_1 = obj.next()
 * var param_2 = obj.hasNext()
 */

export { BSTIterator }