LeetCode-in-Go

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

type BSTIterator struct {
	node *TreeNode
}

func Constructor(root *TreeNode) BSTIterator {
	return BSTIterator{node: root}
}

func (this *BSTIterator) Next() int {
	res := -1
	for this.node != nil {
		if this.node.Left != nil {
			rightMost := this.node.Left
			for rightMost.Right != nil {
				rightMost = rightMost.Right
			}
			rightMost.Right = this.node
			temp := this.node.Left
			this.node.Left = nil
			this.node = temp
		} else {
			res = this.node.Val
			this.node = this.node.Right
			return res
		}
	}
	return res
}

func (this *BSTIterator) HasNext() bool {
	return this.node != nil
}