https://leetcode.cn/problems/opLdQZ/
二、具体代码
var inorderTraversal = function(root, list) {
if ( root === null ) {
return;
}
inorderTraversal(root.left, list);
list.push(root.val);
inorderTraversal(root.right, list);
}
var findTarget = function(root, k) {
let list = [];
// 1、对二叉搜索书进行递归中序遍历,获得升序后的数组;
inorderTraversal(root, list);
// 2、双指针法,检验升序数组中是否存在两个数之和等于k
let left = 0;
let right = list.length - 1;
while(left < right) {
if(list[left] + list[right] === k) {
return true;
} else {
if(list[left] + list[right] < k) {
left++;
}else {
right--;
}
}
}
// 未找到,直接返回false
return false;
};
三、具体思路
1、注意到二叉搜索树的中序遍历是升序排列的,我们可以将该二叉搜索树的中序遍历的结果记录下来,得到一个升序数组。
2、这样该问题即转化为「167. 两数之和 II - 输入有序数组」。我们可以使用双指针解决它。
3、具体地,我们使用两个指针分别指向数组的头尾,当两个指针指向的元素之和小于 k 时,让左指针右移;当两个指针指向的元素之和大于 k 时,让右指针左移;当两个指针指向的元素之和等于 k 时,返回 True。
4、最终,当左指针和右指针重合时,树上不存在两个和为 k 的节点,返回 False。
四、补充部分关注公众号【深漂程序员小庄】:
内含丰富的学习资源和面试经验(不限前端、java、算法),还有学习交流群可加,并且还有各大厂大佬可一起交流学习,一起进步~添加小庄微信,回复【加群】,可加入互联网技术交流群:



