class TreeNode {
constructor(val, left = null, right = null) {
this.val = val;
this.left = left;
this.right = right;
}
}
function* inorderTraversal(root) {
if (!root) return;
yield* inorderTraversal(root.left);
yield root.val;
yield* inorderTraversal(root.right);
}
function* reverseInorderTraversal(root) {
if (!root) return;
yield* reverseInorderTraversal(root.right);
yield root.val;
yield* reverseInorderTraversal(root.left);
}
function twoSumBST(root, target) {
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 === target) {
return [leftVal.value, rightVal.value];
} else if (sum < target) {
leftVal = leftIter.next(); // move left pointer forward to increase sum
} else {
rightVal = rightIter.next(); // move right pointer backward to decrease sum
}
}
return null;
}
// Driver code
const root = new TreeNode(5,
new TreeNode(3,
new TreeNode(2),
new TreeNode(4)
),
new TreeNode(7,
null,
new TreeNode(8)
)
);
const target = 9;
const result = twoSumBST(root, target);
if (result) {
console.log(`${result[0]} -> ${result[1]} sum to ${target}`);
} else {
console.log("No pair found");
}let leftVal = leftIter.next();
let rightVal = rightIter.next();
initialize pointers to smallest and largest values
while (!leftVal.done && !rightVal.done && leftVal.value < rightVal.value) {
loop while pointers do not cross
const sum = leftVal.value + rightVal.value;
calculate current sum of two pointers
if (sum === target) { return [leftVal.value, rightVal.value]; }
found pair that sums to target
else if (sum < target) { leftVal = leftIter.next(); }
sum too small, move left pointer forward to increase sum
else { rightVal = rightIter.next(); }
sum too big, move right pointer backward to decrease sum