剑指 Offer II 056. 二叉搜索树中两个节点之和(653. 两数之和 IV - 输入二叉搜索树)

题目:

 

 

思路:

【1】思路1:对于树优先是遍历完全部,把数值拿出来(如中序遍历,形成数组后采用双指针就可以了判断了)。

【2】思路2:对于树优先是在遍历过程中,遍历的要存起来,且要判断差值是否已经存在了。

代码展示:

思路1的方式:

//时间2 ms击败95.45%
//内存42 MB击败46.20%
class Solution {
    List<Integer> list = new ArrayList<Integer>();

    public boolean findTarget(TreeNode root, int k) {
        inorderTraversal(root);
        int left = 0, right = list.size() - 1;
        while (left < right) {
            if (list.get(left) + list.get(right) == k) {
                return true;
            }
            if (list.get(left) + list.get(right) < k) {
                left++;
            } else {
                right--;
            }
        }
        return false;
    }

    public void inorderTraversal(TreeNode node) {
        if (node == null) {
            return;
        }
        inorderTraversal(node.left);
        list.add(node.val);
        inorderTraversal(node.right);
    }
}

 

思路2的方式(如层次遍历的方式,当然其他遍历的方式也可以,这种会比思路一要好,因为不一定要把树全部遍历完,或许遍历一部分就可以得到返回值了):

//时间3 ms击败43.11%
//内存41.7 MB击败82.88%
/**
 * 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 {
    public boolean findTarget(TreeNode root, int k) {
        Set<Integer> set = new HashSet<Integer>();
        Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
        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;
    }
}

或者递归遍历的方式:

//时间2 ms击败96.72%
//内存41.6 MB击败94.1%
//如这种递归遍历的方式也可以
class Solution {
    Set<Integer> set = new HashSet<Integer>();

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

 

posted @ 2023-03-01 17:32  忧愁的chafry  阅读(13)  评论(0)    收藏  举报