Leetcode 653 兩數之和IV - 輸入BST
阿新 • • 發佈:2020-12-10
Leetcode 653 兩數之和IV - 輸入BST
資料結構定義:
給定一個二叉搜尋樹和一個目標結果,如果 BST 中存在兩個元素且它們的和等於給定的目標結果,則返回 true。 案例 1: 輸入: 5 / \ 3 6 / \ \ 2 4 7 Target = 9 輸出: True 案例 2: 輸入: 5 / \ 3 6 / \ \ 2 4 7 Target = 28 輸出: False /** * 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 { private Set<Integer> set = new HashSet<>(); public boolean findTarget(TreeNode root, int k) { if(root == null) return false; if(set.contains(k - root.val)) return true; set.add(root.val); return findTarget(root.left,k) || findTarget(root.right,k); } }
廣度優先遍歷方式:
class Solution { public boolean findTarget(TreeNode root, int k) { if(root == null) return false; Set<Integer> set = new HashSet<>(); Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while(!queue.isEmpty()){ TreeNode node = queue.poll(); if(set.contains(k - node.val)) return true; set.add(node.val); if(node.left != null) queue.offer(node.left); if(node.right != null) queue.offer(node.right); } return false; } }
中序 + 雙指標:
/*
* 思路: 先中序遍歷出所有的數值,然後雙指標比較兩數之和
*/
class Solution {
private List<Integer> list =new ArrayList<>();
public boolean findTarget(TreeNode root, int k) {
if(root == null)
return false;
inOrder(root);
int i = 0,j = list.size()-1;
while(i < j){
int sum = list.get(i) + list.get(j);
if(sum == k)
return true;
else if(sum < k)
i++;
else
j--;
}
return false;
}
private void inOrder(TreeNode root){
if(root == null)
return;
inOrder(root.left);
list.add(root.val);
inOrder(root.right);
}
}