「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。
题目
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:root = [2,1,3] 输出:true 示例 2:
输入:root = [5,1,4,null,null,3,6] 输出:false 解释:根节点的值是 5 ,但是右子节点的值是 4 。
提示:
树中节点数目范围在[1, 104] 内 -231 <= Node.val <= 231 - 1
思路
咋一看题目没啥思路,仔细看完之后发现只要满足中序遍历,原因如下:
第一眼的想法也是中序遍历。二叉搜索树中序遍历得到升序,对给定的二叉树中序遍历,结果记录于res之中,检验res是否为严格的升序,若是则为true,反之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 = []
dfs = (root) =>{
if (root === null) {
return
}
dfs(root.left)
res.push(root.val)
dfs(root.right)
}
dfs(root)
for (let i = 0; i<res.length; i++) {
if(res[i] <= res[i-1]) return false
}
return true
};
时间复杂度 : O(n)O(n),其中 nn 为二叉树的节点个数。二叉树的每个节点最多被访问一次,因此时间复杂度为 O(n)O(n)。
空间复杂度 : O(n)O(n),其中 nn 为二叉树的节点个数。栈最多存储 nn 个节点,因此需要额外的 O(n)O(n) 的空间。