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* inorderTraversal(root: TreeNode | null): Generator<number> {
if (!root) return;
yield* inorderTraversal(root.left);
yield root.val;
yield* inorderTraversal(root.right);
}
function* reverseInorderTraversal(root: TreeNode | null): Generator<number> {
if (!root) return;
yield* reverseInorderTraversal(root.right);
yield root.val;
yield* reverseInorderTraversal(root.left);
}
function findTarget(root: TreeNode | null, k: number): boolean {
if (!root) return false;
const leftIter = inorderTraversal(root);
const rightIter = reverseInorderTraversal(root);
let leftVal = leftIter.next();
let rightVal = rightIter.next();
while (!leftVal.done && !rightVal.done && leftVal.value < rightVal.value) {
const sum = leftVal.value + rightVal.value;
if (sum === k) {
console.log(`Pair found: ${leftVal.value} + ${rightVal.value} = ${k}`);
return true;
} else if (sum < k) {
leftVal = leftIter.next(); // move left pointer forward to increase sum
} else {
rightVal = rightIter.next(); // move right pointer backward to decrease sum
}
}
console.log("No pair found");
return false;
}
// Driver code
const root = new TreeNode(5,
new TreeNode(3,
new TreeNode(2),
new TreeNode(4)
),
new TreeNode(7,
null,
new TreeNode(8)
)
);
console.log("Inorder traversal of BST:");
const inorderValues = [...inorderTraversal(root)];
console.log(inorderValues.join(" -> ") + " -> null");
findTarget(root, 9);while (!leftVal.done && !rightVal.done && leftVal.value < rightVal.value) {
continue while left pointer is before right pointer to avoid overlap
const sum = leftVal.value + rightVal.value;
calculate sum of current pair values
check if sum matches target
leftVal = leftIter.next(); // move left pointer forward to increase sum
advance left pointer to get larger value when sum too small
rightVal = rightIter.next(); // move right pointer backward to decrease sum
advance right pointer backward to get smaller value when sum too large
Inorder traversal of BST:
2 -> 3 -> 4 -> 5 -> 7 -> 8 -> null
Pair found: 2 + 7 = 9