持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【LeetCode 98. 验证二叉搜索树 】- JavaScript(中序遍历+递归)
题目描述
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:root = [2,1,3] 输出:true
递归中序遍历
思路分析:
整体的的思路:分析题目知道这题目可以使用递归式的中序遍历来做,该方法有一个前提:树不为空,为空需要多设计一个方法,大致思路:
- 首先找出根节点左子树的最右子节点,判断根节点值是否大于该值
- 然后找出根节点右子树的最左子节点,判断根节点值是否小于该值
- 满足上述条件的情况下,采用递归的方法判断左子树和右子树是否满足二叉搜索树的要求。
为了验证二叉搜索树,我们知道任一节点的值必须大于其左子树的所有节点的值,且小于其右子树所有节点的值。这是二叉搜索树的定义,因此我们需要两个列表分别用来存放该节点的节点的值,必须大于该节点的节点的值。具体实现注意点:
- 如果树为空,return false,设置一个最小值,初始化为负无穷,设置一个最大值,初始化为正无穷,每次都判断节点的值在这个区间内。
- 第一次先判断root,root肯定是符合要求的。继续检查root的左、右。检查root的左子树时,值不应该超过上界(上界就是父节点的值)。
- 同理,右子树的值不应该小于下界。
var isValidBST = function(root) {
let isValid = true;
const numList = [];
function recur(node) {
if (!node) {
return;
}
checkValid() && recur(node.left);
numList.push(node.val);
checkValid() && recur(node.right);
}
recur(root);
function checkValid() {
if (numList.length < 2) {
return true;
}
const currValid = numList[0] < numList[1];
if (!currValid) {
isValid = false;
}
numList.shift();
return isValid && currValid;
}
return isValid;
};
思考
题目其实不是很难,但是我WA了好多次,卡边界值太恶心了。呜呜呜...
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤