【LeetCode】653. Two Sum IV - Input is a BST

二叉搜索树中寻找目标和
本文介绍了一种在二叉搜索树中查找是否存在两个元素之和等于给定目标值的方法。首先进行中序遍历获取有序数组,然后利用双指针技巧检查是否存在和为目标值的两个数。

【题目】

Given a Binary Search Tree and a target number, return true if there exist two elements in the BST such that their sum is equal to the given target.

Example 1:

Input: 
    5
   / \
  3   6
 / \   \
2   4   7

Target = 9

Output: True

Example 2:

Input: 
    5
   / \
  3   6
 / \   \
2   4   7

Target = 28

Output: False

【分析】

输入是二叉搜索树,二叉搜索树又叫二叉排序树,是一种有序的树,通过遍历可以得到一个有序数组,得到有序数组之后可以采用两指针法从两端向中间遍历,看是否有两个数的和等于target。时间复杂度为最坏为O(h2),最好为O(h),空间复杂度为O(n),n为节点个数。

【代码】

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public void middleTraversal(TreeNode root,List<Integer> nums){
        if(null==root) return;
        middleTraversal(root.left,nums);
        nums.add(root.val);
        middleTraversal(root.right,nums);
    }
    public boolean findTarget(TreeNode root, int k) {
        //先中序遍历二叉搜索树,存到list中,然后从list中找
        List<Integer> nums=new ArrayList<Integer>();
        middleTraversal(root,nums);
        int len=nums.size();
        int i=0,j=len-1;
        while(i<j){
            if(nums.get(i)+nums.get(j)==k) return true;
            while(i<j && nums.get(i)+nums.get(j)<k) ++i;
            while(i<j && nums.get(i)+nums.get(j)>k) --j;
        }
        return false;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值