剑指 Offer II 056. 二叉搜索树中两个节点之和

421 阅读1分钟

「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

给定一个二叉搜索树的 根节点 root 和一个整数 k , 请判断该二叉搜索树中是否存在两个节点它们的值之和等于 k 。假设二叉搜索树中节点的值均唯一。

示例 1:

输入: root = [8,6,10,5,7,9,11], k = 12
输出: true
解释: 节点 5 和节点 7 之和等于 12

示例 2:

输入: root = [8,6,10,5,7,9,11], k = 22
输出: false
解释: 不存在两个节点值之和为 22 的节点

 

提示:

    二叉树的节点个数的范围是  [1, 104].
    -104 <= Node.val <= 104
    root 为二叉搜索树
    -105 <= k <= 105

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/op…

思路

  • 首先看到这道题,我们会想到最初的LeetCode的两数之和
    • 那么不妨来看一下LeetCode的第一题两数之和的思路

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            if (map.containsKey(target - nums[i])) {
                return new int[]{map.get(target - nums[i]),i};
            } else {
                map.put(nums[i],i);
            }
        }
        return new int[]{};
    }
}

/**
 * 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<>();
        Stack<TreeNode> stack= new Stack<>();
        TreeNode cur = root;
        while (cur != null || !stack.isEmpty()) {
            while (cur != null) {
                stack.add(cur);
                cur = cur.left;
            }
            cur = stack.pop();
            if (set.contains(k - cur.val)) {
                return true;
            }
            set.add(cur.val);
            cur = cur.right;
        } 
        return false;
    }
}
  • 可以看到使用一个辅助的map进行存储
    • 所以对应二叉搜索树

    • 我们可以一直往左子树进行遍历

    • 一直进行存储左子树的节点,每次进行弹出的时候

    • 再看Set中是否存在值为target - val

    当然这道题也可以将二叉搜索树的性质发挥的淋漓尽致,可以将二叉搜索树看成一个排序的数组,再进行双指针操作