春招打卡|两数之和 IV - 输入 BST

58 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

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

示例 1:

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

二、思路分析

  1. 两数之和换了一种遍历方式,数据的载体换成了二叉搜索树。
  2. 使用哈希表将当前遍历到的值存入,使用目标值减去当前值,并将该值赋值给遍历target
  3. 在哈希表中查询target,如果target存在,则表示我们之前遍历到过该值,返回true

三、AC 代码

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func findTarget(root *TreeNode, k int) bool {
    m := make(map[int]bool)
    return dfs(root,m,k)

}
func dfs(node *TreeNode,m map[int]bool,k int) bool{
    if node == nil {
        return false
    }
    target := k - node.Val
    if m[target] {
        return true
    }
    m[node.Val] = true
    
    return dfs(node.Left,m,k) || dfs(node.Right,m,k)
}

四、总结

本题与两数之和第一版本的区别是数据载体从数组换为了二叉树,更改遍历形式为dfs,结合哈希表,即可简单的找到是否有数据存在,在哈希表中存储遍历到的节点值,每次遍历计算当前值和目标值的差,就是我们要寻找的数。注意点:哈希表记录前就寻找目标值。