📌  相关文章
📜  计算来自两个BST的对,它们的和等于给定值x(1)

📅  最后修改于: 2023-12-03 15:28:03.786000             🧑  作者: Mango

解法介绍:计算来自两个BST的对,它们的和等于给定值x

在二叉搜索树中,我们可以使用中序遍历将元素按顺序排序。因此,对于两个二叉搜索树,我们可以使用中序遍历得到两个有序数组。接下来,我们可以使用双指针方法从这两个有序数组中找到和为给定值x的元素对。

具体步骤如下:

  1. 将两个二叉搜索树分别中序遍历,得到两个有序数组A和B。

  2. 使用双指针方法,在A和B中查找和为x的元素对。

    a. 初始化指针i=0,j=0。

    b. 当i<A.length且j<B.length时,执行以下操作:

    • 如果A[i]+B[j]等于x,则将(A[i], B[j])加入结果集,并继续往后移动i和j指针。
    • 如果A[i]+B[j]小于x,则将i指针往后移动一位。
    • 如果A[i]+B[j]大于x,则将j指针往后移动一位。

    c. 返回结果集。

时间复杂度为O(m+n),其中m和n分别是两个二叉搜索树中的节点个数。

代码实现

public class Solution {
    public List<List<Integer>> findTarget(TreeNode root1, TreeNode root2, int k) {
        List<List<Integer>> res = new ArrayList<>();
        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = new ArrayList<>();
        inorder(root1, list1);
        inorder(root2, list2);
        int i = 0, j = list2.size() - 1;
        while (i < list1.size() && j >= 0) {
            int sum = list1.get(i) + list2.get(j);
            if (sum == k) {
                res.add(Arrays.asList(list1.get(i), list2.get(j)));
                i++;
                j--;
            } else if (sum < k) {
                i++;
            } else {
                j--;
            }
        }
        return res;
    }

    private void inorder(TreeNode root, List<Integer> list) {
        if (root == null) {
            return;
        }
        inorder(root.left, list);
        list.add(root.val);
        inorder(root.right, list);
    }
}