Leetcode_#653_两数之和Ⅳ-输入BST

原题:#653_两数之和Ⅳ-输入BST

  • 解法一:
    • 每遍历一个值,都将之与HashSet中的值进行比较
    • 若符合x+y=k,则返回true
    • 若不符合,则将之存入hashset中,然后去它的左子树和右子树中找
public boolean findTarget(TreeNode root, int k) {
    Set<Integer> set = new HashSet();
    return helper(root, k, set);
}
public boolean helper(TreeNode root, int k, Set<Integer> set) {
    if (root == null) {
        return false;
    }
    if (set.contains(k-root.val)) {
        return true;
    }
    set.add(root.val);
    return helper(root.left, k, set) || helper(root.right, k, set);
}

  • 解法二:
    • 先用中序遍历递归整棵树,把节点放到一个数组中
    • 再用双指针,分别从头、尾往中间走
      • 若两指针所指的值之和等于目标值,则返回true
      • 若两只指针所指的值之和大于目标值,则尾指针往回走一步
      • 若两只指针所指的值之和小于目标值,则首指针往前走一步
public boolean findTarget(TreeNode root, int k) {
    List<Integer> nums = new ArrayList<>();
    inOrder(root, nums);
    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 void inOrder(TreeNode root, List<Integer> nums) {
    if (root == null) return;
    inOrder(root.left, nums);
    nums.add(root.val);
    inOrder(root.right, nums);
}
原创文章 50 获赞 1 访问量 2913

猜你喜欢

转载自blog.csdn.net/u014642412/article/details/105952418
今日推荐