这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战。
验证二叉搜索树
题目
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:root = [2,1,3]
输出:true
示例 2:
输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。
方法
思路:
- 若二叉树中序遍历后是升序的,那么一定满足上述条件;
- 定义一个全局结果值
res,以节点为空作为终止条件递归; - 每遍历一次,如果符合前后大小的要求,就将当前节点的值赋值给
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
解题方法
思路:
- 定义一个辅助方法
help,包含入参root,k,map; - 在
findTarget中新建一个map,作为参数传递给help「若在外部定义一个map,直接使用 findTarget 递归,会出现 map 中的元素包含以往多次的情况,导致结果不准确」; - 若
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