Skip to content

Part2

Floor in a BST

class Solution:
    def floor(self, root, X):
        node = root
        res = -1

        while node:
            if node.data == X:
                return node.data
            elif node.data < X:
                res = max(res, node.data)
                node = node.right
            else:
                node = node.left

        return res

💻


Ceil in a BST

class Solution:
    def findCeil(self, root, X):
        res = float("inf")
        node = root

        while node:
            if node.key == X:
                return node.key

            elif node.key > X:
                res = min(res, node.key)
                node = node.left

            else:
                node = node.right

        return res if res != float("inf") else -1

💻


Find K-th smallest element in BST

Example:

alternate

Input: root = [5,3,6,2,4,null,null,1], k = 3
Output: 3

class Solution:
    def kthSmallest(self, root: Optional[TreeNode], k: int) -> int:
        self.k = k
        self.res = None
        self.inorder(root)
        return self.res

    def inorder(self, node):
        if not node:
            return

        self.inorder(node.left)
        self.k -= 1
        if not self.k:
            self.res = node.val
            return
        self.inorder(node.right)
var k_dup int
var res int

func kthSmallest(root *TreeNode, k int) int {
    k_dup = k
    inorder(root)
    return res
}

func inorder(node *TreeNode) {
    if node == nil {
        return
    }
    inorder(node.Left)
    k_dup -= 1
    if k_dup == 0 {
        res = node.Val
        return
    }
    inorder(node.Right)
}

💻


Find K-th largest element in BST

class Solution:
    def kthLargest(self, root, k):
        self.k = k
        self.res = None
        self.inorder(root)
        return self.res

    def inorder(self, node):
        if not node:
            return

        self.inorder(node.right)
        self.k -= 1
        if not self.k:
            self.res = node.data
            return
        self.inorder(node.left)
var k_dup int
var res int

func kthLargest(root *TreeNode, k int) int {
    k_dup = k
    inorder(root)
    return res
}

func inorder(node *TreeNode) {
    if node == nil {
        return
    }
    inorder(node.Right)
    k_dup -= 1
    if k_dup == 0 {
        res = node.Val
        return
    }
    inorder(node.Left)
}

💻


Find a pair with a given sum in BST

class Solution:
    def findTarget(self, root: Optional[TreeNode], k: int) -> bool:
        self.k = k
        return self.helper(root, set())

    def helper(self, node, seen):
        if not node:
            return False

        if self.k - node.val in seen:
            return True

        seen.add(node.val)
        return self.helper(node.left, seen) or self.helper(node.right, seen)
func findTarget(root *TreeNode, k int) bool {
    return helper(root, map[int]bool{}, k)
}

func helper(node *TreeNode, seen map[int]bool, k int) bool {
    if node == nil {
        return false
    }
    if seen[k-node.Val] {
        return true
    }
    seen[node.Val] = true
    return helper(node.Left, seen, k) || helper(node.Right, seen, k)
}

💻


BST iterator

Refer leetcode link for problem description

class BSTIterator:
    def __init__(self, root: Optional[TreeNode]):
        self.inorder_arr = []
        self._inorder(root)
        self.curr_ind = -1

    def next(self) -> int:
        self.curr_ind += 1
        return self.inorder_arr[self.curr_ind]

    def hasNext(self) -> bool:
        return (self.curr_ind + 1) < len(self.inorder_arr)

    def _inorder(self, node):
        if not node:
            return
        self._inorder(node.left)
        self.inorder_arr.append(node.val)
        self._inorder(node.right)
type BSTIterator struct {
    InorderArr []int
    CurrInd    int
}

func Constructor(root *TreeNode) BSTIterator {
    obj := BSTIterator{CurrInd: -1}
    inorder(root, &obj)
    return obj
}

func inorder(node *TreeNode, obj *BSTIterator) {
    if node == nil {
        return
    }
    inorder(node.Left, obj)
    obj.InorderArr = append(obj.InorderArr, node.Val)
    inorder(node.Right, obj)
}

func (this *BSTIterator) Next() int {
    this.CurrInd += 1
    return this.InorderArr[this.CurrInd]
}

func (this *BSTIterator) HasNext() bool {
    return this.CurrInd+1 < len(this.InorderArr)
}

💻