1. 程式人生 > 實用技巧 >Leetcode 653 兩數之和IV - 輸入BST

Leetcode 653 兩數之和IV - 輸入BST

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);
    }
}