大家好今天给大家分享下一道 LeetCode 中等难度 的题目98. 验证二叉搜索树
题目
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:root = [2,1,3] 输出:true
示例 2:
输入:root = [5,1,4,null,null,3,6] 输出:false 解释:根节点的值是 5 ,但是右子节点的值是 4 。
分析
1.左子节点小于当前节点
2.右子节点大于当前节点
3.整个树都要满足左边子节点大于右边子节点
4.返回boolean值
解法
1.递归
2.迭代
解法一:递归
思路
1.因为是二叉搜索树 所以中序遍历一定是一个升序数组
2.所以先中序遍历
3.再判断是否为升序数组
*/
var isValidBST = function (root) {
const res = [];
let isValid = true;
function recursion(root) {
if (!root) return;
recursion(root.left);
if (res.includes(root.val)) {
isValid = false;
}
res.push(root.val);
isValid = isValid && isAscending(res);
recursion(root.right);
}
recursion(root);
function isAscending(res) {
const newArr = [...res];
return newArr.sort((a, b) => a - b).join("") === res.join("");
}
return isValid;
};
/* 复杂度
时间 O(n^2Logn)
空间 O(nlogn)
*/
解法二:迭代
思路
1.和递归思路一样只是在中序遍历的时候使用了 迭代的方式
*/
var isValidBST = function (root) {
const res = [];
const stack = [];
let isValid = true;
while (root || stack.length) {
while (root) {
stack.push(root);
root = root.left;
}
root = stack.pop();
if (res.includes(root.val)) {
isValid = false;
}
res.push(root.val);
isValid = isValid && isAscending(res);
root = root.right;
}
function isAscending(res) {
const newArr = [...res];
return newArr.sort((a, b) => a - b).join("") === res.join("");
}
};
/* 复杂度
时间 O(n^2Logn)
空间 O(nlogn)
*/
总结
今天这道题是主要是练习中序遍历和判断升序数组
大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢
大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持
文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com