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 inorderSuccessor(root: TreeNode | null, p: TreeNode): TreeNode | null {
if (p.right !== null) {
// successor is leftmost node in right subtree
let curr = p.right;
while (curr.left !== null) {
curr = curr.left; // move left to find smallest node
}
return curr;
}
let successor: TreeNode | null = null;
let curr = root;
while (curr !== null) {
if (p.val < curr.val) {
successor = curr; // update candidate
curr = curr.left; // move left to find smaller candidate
} else {
curr = curr.right; // move right to find larger nodes
}
}
return successor;
}
// Driver code
const root = new TreeNode(5,
new TreeNode(3,
new TreeNode(2),
new TreeNode(4)
),
new TreeNode(7,
null,
new TreeNode(8)
)
);
const p = root.left.right; // node with value 4
const successor = inorderSuccessor(root, p);
if (successor !== null) {
console.log(successor.val + " -> " + (successor.right ? successor.right.val : "null") + " -> null");
} else {
console.log("null");
}check if node has right subtree to find successor
while (curr.left !== null) {
find leftmost node in right subtree
update successor candidate when current node is greater
move left to find smaller successor candidate
move right when current node is less or equal to p