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;
}
}
function floorInBST(root: TreeNode | null, target: number): number | null {
let floor: number | null = null;
let curr = root;
while (curr !== null) {
if (curr.val === target) {
return curr.val; // exact match is floor
} else if (curr.val < target) {
floor = curr.val; // update floor
curr = curr.right; // try to find closer floor
} else {
curr = curr.left; // go left to find smaller values
}
}
return floor;
}
function ceilInBST(root: TreeNode | null, target: number): number | null {
let ceil: number | null = null;
let curr = root;
while (curr !== null) {
if (curr.val === target) {
return curr.val; // exact match is ceil
} else if (curr.val > target) {
ceil = curr.val; // update ceil
curr = curr.left; // try to find closer ceil
} else {
curr = curr.right; // go right to find bigger values
}
}
return ceil;
}
// Build BST from example
const root = new TreeNode(8,
new TreeNode(4,
new TreeNode(2),
new TreeNode(6)
),
new TreeNode(12,
new TreeNode(10),
new TreeNode(14)
)
);
const target = 5;
const floorValue = floorInBST(root, target);
const ceilValue = ceilInBST(root, target);
console.log(`Floor: ${floorValue}`);
console.log(`Ceil: ${ceilValue}`);Traverse nodes until no more to check
if (curr.val === target) { return curr.val; }
Exact match found, return immediately
else if (curr.val < target) { floor = curr.val; curr = curr.right; }
Update floor and move right to find closer floor
else { curr = curr.left; }
Move left to find smaller values
else if (curr.val > target) { ceil = curr.val; curr = curr.left; }
Update ceil and move left to find closer ceil
else { curr = curr.right; }
Move right to find bigger values