注:本文的实现思路主要是基于JS(JavaScript),涉及到的一些函数都是JS中的自带函数

题目描述

给定一个二叉搜索树 root 和一个目标结果 k,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。


输入示例

示例1:

输入: root = [5,3,6,2,4,null,7], k = 9
输出: true

示例2:

输入: root = [5,3,6,2,4,null,7], k = 28
输出: false

解题思路

1. 排序查找法

先按照中序遍历,可以得到从小到大排列的所有节点值的数组。因为题目中所给的树是二叉搜索树,左节点的值小于根节点的值小于右节点的值。然后使用双指针的方法,分别从左到右和从右到左,检查两个指针所指向的元素之和是否为k,若小于k,则左指针右移;若大于k,则右指针左移。

var findTarget = function(root, k) {// 用于存放排序后的数组let nums = []// 递归函数,用于中序遍历给定的二叉搜索树let inOrder = (root) => {if(root === null) returnelse{// 中序遍历,先左,再根,最后右inOrder(root.left)nums.push(root.val)inOrder(root.right)}}inOrder(root)// 定义左右指针let left = 0let right = nums.length - 1while(left < right){// 找到后,返回 trueif(nums[left] + nums[right] === k) return true// 两指针所指向的元素之和小于 k,左指针右移else if(nums[left] + nums[right] <= k) left ++// 两指针所指向的元素之和大于 k,右指针左移else right --}// 没找到,返回 falsereturn false
}

2. 哈希遍历法

既然是一棵树,完全遍历的复杂度也才为O(n)O(n)O(n),因此,我们可以将这个树进行遍历,使用集合存放已经遍历过的节点值,遍历的同时查看k与当前节点的值之差是否存在于集合中,存在,则返回true

var findTarget = function(root, k) {// 放已经遍历过节点值的集合let set = new Set()// 保存最终结果,默认为 falselet result = falselet traverse= (root, k)=>{if(root === null) return// 能够在集合中找到与当前节点值之和为 k 的数值else if(set.has(k - root.val)){return result = true}else{// 将当前值存放到集合中set.add(root.val)traverse(root.left, k)traverse(root.right, k)}}traverse(root, k)return result
};

力扣题目——653. 两数之和 IV - 输入 BST相关推荐

  1. LeetCode 653. 两数之和 IV - 输入 BST(二叉搜索树迭代器双指针)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true. 案例 1: 输入: 5/ \3 6/ \ ...

  2. 两数之和 IV - 输入 BST

    两数之和 IV - 输入 BST 题目 两数之和 IV - 输入 BST(力扣:653) 给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true. ...

  3. 【每日一算法】两数之和 IV - 输入 BST

    微信改版,加星标不迷路! 每日一算法-两数之和IV-输入BST 作者:阿广 阅读目录 1 题目 2 解析 1 题目 给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目 ...

  4. LeetCode简单题之两数之和 IV - 输入 BST

    题目 给定一个二叉搜索树 root 和一个目标结果 k,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true. 示例 1: 输入: root = [5,3,6,2,4,null, ...

  5. 力扣题目——1. 两数之和

    注:本文的实现思路主要是基于JS(JavaScript),涉及到的一些函数都是JS中的自带函数 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 t ...

  6. LeetCode(653)——两数之和 IV - 输入 BST(JavaScript)

    给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true. 示例1: 输入: 输出: True 示例2: 输入: 输出: False /*** De ...

  7. 力扣-167题 两数之和 II - 输入有序数组(C++)- 双指针

    题目链接:https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted/ 题目如下: class Solution {public ...

  8. 力扣(leetcode)-1. 两数之和

    描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组 ...

  9. 双指针算法(三):力扣【167.两数之和 | 经典例题

    本文将讲述双指针算法的一个经典例题,167.两数之和 [题目描述] 给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target . 函数应该以长 ...

最新文章

  1. 19个超赞的数据科学和机器学习工具,编程小白必看!(附资料)
  2. “中国式招标”的一些趣闻
  3. 因果图法的介绍与示例分析【转载】
  4. 几个经常需要自定义的View总结
  5. 在mac上搭建了Java 环境,谨以此文写给自己
  6. My favorite books
  7. 带电检测必要性_接地电阻检测分析的必要性
  8. 計算機二級-java04
  9. python画柱形图把奇数年份也显示出来_python - Matplotlib奇数子图 - 堆栈内存溢出...
  10. jQuery基础——选择器
  11. FreeBSD学习笔记17-FreeBSD下安装MySQL数据库
  12. 【图像压缩】基于matlab DCT变换图像压缩【含Matlab源码 804期】
  13. 电脑桌面图标变成长方形咋办_电脑桌面图标间距自动变宽为什么
  14. 【转】Excel 使用技巧集锦——163种技巧
  15. anaconda base环境的地址_Anaconda安装及环境管理
  16. C++ map下标访问的问题
  17. 软件工程技术--第一章 概述
  18. FPGA开发 Quartus Signaltap的基本使用
  19. 内部寄存器:通用寄存器、控制寄存器、段寄存器
  20. UVC webcam添加H264 NV12等格式支持

热门文章

  1. python实现编辑距离,最长公共子序列,最长公共子串
  2. Struts2 action的扩展名两种修改方法
  3. python利用什么写模块_python模块是什么?写法及作用分析
  4. linux 下的emoji在MariaDB中的字符集修改
  5. STM32的JTAG下载模式
  6. mysql delete 数据之后 .MYD文件大小没有发生变化
  7. ASP.NET运行模式
  8. C#—接口和抽象类的区别?
  9. poj1470 LCA倍增法
  10. 【搜索】【广搜模板】