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 kthSmallest(root: TreeNode | null, k: number): number {
let count = 0;
let result = -1;
function inorder(node: TreeNode | null) {
if (node === null || result !== -1) return;
inorder(node.left); // traverse left subtree
count++;
if (count === k) {
result = node.val; // found kth smallest
return;
}
inorder(node.right); // traverse right subtree
}
inorder(root);
return result;
}
// Driver code
const root = new TreeNode(5,
new TreeNode(3,
new TreeNode(2),
new TreeNode(4)
),
new TreeNode(7,
null,
new TreeNode(8)
)
);
const k = 3;
console.log(kthSmallest(root, k));if (node === null || result !== -1) return;
stop traversal if node is null or kth smallest already found
inorder(node.left); // traverse left subtree
visit left subtree first to get smaller values
increment count when visiting a node
if (count === k) { result = node.val; return; }
when count matches k, record result and stop
inorder(node.right); // traverse right subtree
visit right subtree after current node