LeetCode 数据结构入门 day 14 - 树

155 阅读2分钟

这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战

验证二叉搜索树

原题地址

题目

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。  

示例 1:

输入:root = [2,1,3]
输出:true

示例 2:

输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4

方法

思路:

  1. 若二叉树中序遍历后是升序的,那么一定满足上述条件;
  2. 定义一个全局结果值 res,以节点为空作为终止条件递归;
  3. 每遍历一次,如果符合前后大小的要求,就将当前节点的值赋值给 max 变量;如果不符合要求,则将 res 置为 false

代码:

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isValidBST = function(root) {
    let res = true;
    let max = -Number.MAX_VALUE;
    const orderSearch = root => {
        if (root) {
            orderSearch(root.left);
            if (root.val > max) {
                max = root.val;
            } else {
                res = false;
            }
            orderSearch(root.right);
        }
    }
    orderSearch(root);
    return res;
};

结果:

  • 执行结果: 通过
  • 执行用时:76 ms, 在所有 JavaScript 提交中击败了67.59%的用户
  • 内存消耗:45.2 MB, 在所有 JavaScript 提交中击败了11.08%的用户

两数之和 IV - 输入 BST

原题地址

题目

给定一个二叉搜索树 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. 定义一个辅助方法 help,包含入参 rootkmap
  2. findTarget 中新建一个 map,作为参数传递给 help若在外部定义一个map,直接使用 findTarget 递归,会出现 map 中的元素包含以往多次的情况,导致结果不准确」;
  3. map 中含有 k-val 的值,则返回 true,否则,将 val 放入 map 中。

代码:

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} k
 * @return {boolean}
 */

var findTarget = function(root, k) {
    let map = new Map()
    return help(root, k, map)
};

var help = function(root, k, map) {
    if(!root) return false
    if(map[k-root.val]) {
        return true
    }
    map[root.val] = true
    return help(root.left, k, map) || help(root.right, k, map)
}

结果:

  • 执行结果: 通过
  • 执行用时:88 ms, 在所有 JavaScript 提交中击败了82.61%的用户
  • 内存消耗:49.1 MB, 在所有 JavaScript 提交中击败了25.91%的用户
  • 通过测试用例:209 / 209

— END