[LeetCode] 653. Two Sum IV - Input is a BST

Given the root of a Binary Search Tree and a target number k, return true if there exist two elements in the BST such that their sum is equal to the given target.

Example 1:

[LeetCode] 653. Two Sum IV - Input is a BST

Input: root = [5,3,6,2,4,null,7], k = 9
Output: true

Example 2:

[LeetCode] 653. Two Sum IV - Input is a BST

Input: root = [5,3,6,2,4,null,7], k = 28
Output: false

Example 3:

Input: root = [2,1,3], k = 4
Output: true

Example 4:

Input: root = [2,1,3], k = 1
Output: false

Example 5:

Input: root = [2,1,3], k = 3
Output: true

Constraints:

  • The number of nodes in the tree is in the range [1, 104].
  • -104 <= Node.val <= 104
  • root is guaranteed to be a valid binary search tree.
  • -105 <= k <= 105

两数之和 IV - 输入 BST。

给定一个二叉搜索树 root 和一个目标结果 k,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true

这道题不难,这里我提供 BFS 和 DFS 两种做法,两种做法时间空间复杂度都一样。这道题其实还是找两数之和,无非是在一棵树里找。因为遍历的是树所以我们不能排序,但是我们还是可以利用 hashset 来提速。对于当前遇到的节点值 root.val,如果 hashset 里存在另一个值 K - root.val 则返回 true。遍历完整棵树还是找不到的话,则返回 false。

时间O(n)

空间O(n)

BFS实现

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 class Solution {
11     public boolean findTarget(TreeNode root, int k) {
12         HashSet<Integer> set = new HashSet<>();
13         Queue<TreeNode> queue = new LinkedList();
14         queue.offer(root);
15         while (!queue.isEmpty()) {
16             if (queue.peek() != null) {
17                 TreeNode cur = queue.poll();
18                 if (set.contains(k - cur.val)) {
19                     return true;
20                 }
21                 set.add(cur.val);
22                 queue.add(cur.right);
23                 queue.add(cur.left);
24             } else {
25                 queue.poll();
26             }
27         }
28         return false;
29     }
30 }

 

DFS实现

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 class Solution {
11     public boolean findTarget(TreeNode root, int k) {
12         HashSet<Integer> set = new HashSet<>();
13         return dfs(root, set, k);
14     }
15 
16     private boolean dfs(TreeNode root, HashSet<Integer> set, int k) {
17         if (root == null) return false;
18         if (set.contains(k - root.val)) {
19             return true;
20         }
21         set.add(root.val);
22         return dfs(root.left, set, k) || dfs(root.right, set, k);
23     }
24 }

 

LeetCode 题目总结

上一篇:2021牛客多校5 H Holding Two


下一篇:牛客多校2021(五)H. Holding Two(构造、思维)