「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题意描述
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:root = [2,1,3] 输出:true
解法1:DFS(深度优先搜索)
分析:
深度优先搜索,如果前边的值比后边的大,就false,因为深度优先搜索,先出来的是左值,然后 顶点 然后 右值 但是需要注意的是
- v取值的时候,一定要Math.MIN_VALUE。
- 边界掉件<= 不能漏掉等于号
var isValidBST = function(root) {
function helper(node){
if(!node){return true}
let leftOk=helper(node.left);
if(store.length){
if(store[store.length-1]>=node.val){return false}
}
store.push(node.val);
let rightOk=helper(node.right);
return leftOk&&rightOk;
}
let store=[];
return helper(root)
};
思路2:中序遍历+列表
分析:根据搜索二叉树的性质中序遍历为升序序列,可以先中序遍历搜索二叉树,将结果保存在List中,之后利用冒泡排序的原理(只扫描一次即可)如果发现中序遍历的结果不是升序的,则返回false。
var isValidBST = function(root) {
if(!root){
return;
}
let isBST = true;
let prev = null;
function travse(root){
if(!root){
return null;
}
root.left && travse(root.left);
if(prev && prev.val >= root.val){
isBST = false;
return;
}
prev = root;
root.right && travse(root.right);
}
travse(root);
return isBST;
};
小分析:其实这个题目还是有几个小陷阱的。
- 陷阱1:不能单纯的比较左节点小于中间节点,右节点大于中间节点就完事了。我们要比较的是 左子树所有节点小于中间节点,右子树所有节点大于中间节点。
- 陷阱2:样例中最小节点 可能是int的最小值,如果这样使用最小的int来比较也是不行的。
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤