前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 75 —— 98. 验证二叉搜索树

LeetCode 75 —— 98. 验证二叉搜索树

作者头像
Regan Yue
发布2023-07-10 14:48:35
1600
发布2023-07-10 14:48:35
举报
文章被收录于专栏:ReganYue's BlogReganYue's Blog

LeetCode 75 —— 98. 验证二叉搜索树

一、题目描述:

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

输入:root = [2,1,3] 输出:true 示例 2:

image-20221013160413373
image-20221013160413373

输入:root = [5,1,4,null,null,3,6] 输出:false 解释:根节点的值是 5 ,但是右子节点的值是 4 。 提示: 树中节点数目范围在[1, 10^4] 内 -2^31 <= Node.val <= 2^31 - 1 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/validate-binary-search-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

这道题考察了什么思想?你的思路是什么?

这道题目我的思路无非是两种,一种用递归,另一种用栈这种数据结构。

用递归写起来比较简单,因为是二叉搜索树,要求左子树所有节点都小于根节点,右子树所有节点都大于根节点。所以我们需要进行根节点与其左右节点的比较。

所以我们可以用一个函数,其初始传入根节点和int64的最小值和最大值作为lower和upper。然后在函数中,我们通过判断当前节点是否大于lower并且小于upper,如果不符合,即return false。然后我们再递归进入root.Left和root.Right。如果是root.Left的话,其lower不变,其upper变成其根节点root的Val。如果是root.Right的话,其upper不变,其lower变成根节点root的Val。

做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

不是,刚开始没有将问题合理建模:

代码语言:javascript
复制
return helper(root.Left,lower,root.Val) && helper(root.Right,root.Val,upper)

这里没有写对,通过重新分析,是先将左边的与lower和根节点的值进行比较,然后再将右边子树的节点与根节点的值和upper进行比较。

有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

二叉搜索树 **中序遍历 **得到的值构成的序列一定是升序的,这启示我们在中序遍历的时候实时检查当前节点的值是否大于前一个中序遍历到的节点的值即可。

代码语言:javascript
复制
func isValidBST(root *TreeNode) bool {
    stack := []*TreeNode{}
    inorder := math.MinInt64
    for len(stack) > 0 || root != nil {
        for root != nil {
            stack = append(stack, root)
            root = root.Left
        }
        root = stack[len(stack)-1]
        stack = stack[:len(stack)-1]
        if root.Val <= inorder {
            return false
        }
        inorder = root.Val
        root = root.Right
    }
    return true
}

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/validate-binary-search-tree/solution/yan-zheng-er-cha-sou-suo-shu-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

三、AC 代码:

代码语言:javascript
复制
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isValidBST(root *TreeNode) bool {
    return helper(root,math.MinInt64,math.MaxInt64)
}

func helper(root *TreeNode,lower, upper int) bool {
    if root == nil {
        return true
    }

    if root.Val >= upper || root.Val <= lower{
        return false
    }

    return helper(root.Left,lower,root.Val) && helper(root.Right,root.Val,upper)
} 

四、总结:

递归的时间复杂度和空间复杂度都是O(n),使用栈,也就是中序遍历的空间复杂度和时间复杂度都是O(n)。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-07-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • LeetCode 75 —— 98. 验证二叉搜索树
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档