1. 程式人生 > >Leetcode 653.兩數之和IV Java&Python

Leetcode 653.兩數之和IV Java&Python

給定一個二叉搜尋樹和一個目標結果,如果 BST 中存在兩個元素且它們的和等於給定的目標結果,則返回 true。

案例 1:

輸入: 
    5
   / \
  3   6
 / \   \
2   4   7

Target = 9

輸出: True

 

案例 2:

輸入: 
    5
   / \
  3   6
 / \   \
2   4   7

Target = 28

輸出: False

凡是題目給出的是二叉搜尋樹而不是二叉樹的時候,一定要以二叉搜尋樹的性質為切入點,這道題目就用到了二叉搜尋樹中序遍歷的結果為有序陣列的性質。得到有序陣列後,做過

167號問題兩數之和II的同學會發現題目驚人的一致,採用對撞指標的方式便可高效的得到答案,演算法時間複雜度為O(n)。

Java

private List<Integer> list = new ArrayList<>();

    public boolean findTarget(TreeNode root, int k) {
        if (root == null) {
            return false;
        }

        inOrder(root);

        int i = 0;
        int 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 node) {
        if (node == null) {
            return;
        }

        inOrder(node.left);
        list.add(node.val);
        inOrder(node.right);
    }

Python

    list = []

    def findTarget(self, root, k):
        """
        :type root: TreeNode
        :type k: int
        :rtype: bool
        """
        if root is None:
            return False

        self.inOrder(root)

        i = 0
        j = len(self.list) - 1

        while i < j:
            sum = self.list[i] + self.list[j]

            if sum == k:
                return True
            elif sum < k:
                i += 1
            else:
                j -= 1

        return False

    def inOrder(self, node):
        if node is None:
            return

        self.inOrder(node.left)
        self.list.append(node.val)
        self.inOrder(node.right)