[LeetCode]653. 两数之和 IV - 输入 BST(java实现)
1. 题目
2. 读题(需要重点注意的东西)
- 一般两数之和的问题,可以用数组来实现,将数据遍历到数组中,再判断数组中是否有两数之和等于k,即可判断。
- 使用中序遍历得到有序数组之后,再利用双指针对数组进行查找。但是应该注意到,这一题不能用分别在左右子树两部分来处理这种思想,因为两个待求的节点可能分别在左右子树中。
3. 解法
解法:递归
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
List<Integer> nums = new ArrayList<>();
public boolean findTarget(TreeNode root, int k) {
if(root == null) return false;
nums = helper(root);
int i = 0, j = nums.size() - 1;
while(i < j){
int sum = nums.get(i) + nums.get(j);
if(sum == k) return true;
if(sum < k) i++;
else j--;
}
return false;
}
private List<Integer> helper(TreeNode root){
if(root == null) return new ArrayList<>();
helper(root.left);
nums.add(root.val);
helper(root.right);
return nums;
}
}
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
- 数组
- 递归法
- 双指针
6. 总结
判断数组中是否有两数之和的这段代码,可以好好学习一下;它利用了二叉搜索树的中序遍历为从小到大排序的数列这样一个性质,将两个for循环变为了一个while循环,降低了时间复杂度。
while(i < j){
int sum = nums.get(i) + nums.get(j);
if(sum == k) return true;
if(sum < k) i++;
else j--;
}