算法日常——验证二叉搜索树

Posted by Maolong on Tuesday, July 27, 2021

问题:

给你一个二叉树的根节点 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
Related Topics
  • 深度优先搜索
  • 二叉搜索树
  • 二叉树

  • 👍 1770
  • 👎 0
  • 题解:

    // @lc code=start
    /**
     * Definition for a binary tree node.
     * type TreeNode struct {
     *     Val int
     *     Left *TreeNode
     *     Right *TreeNode
     * }
     */
    func isValidBST(root *TreeNode) bool {
    	return isValid(root, nil, nil)
    }
    
    func isValid(root *TreeNode, min *int, max *int) bool {
    	if root.Left == nil && root.Right == nil {
    		return true
    	}
    	if root.Left != nil {
    		if root.Left.Val >= root.Val {
    			return false
    		}
    		if min != nil && root.Left.Val <= *min {
    			return false
    		}
    		if max != nil && root.Left.Val >= *max {
    			return false
    		}
    		if !isValid(root.Left, min, &root.Val) {
    			return false
    		}
    	}
    	if root.Right != nil {
    		if root.Right.Val <= root.Val {
    			return false
    		}
    		if min != nil && root.Right.Val <= *min {
    			return false
    		}
    		if max != nil && root.Right.Val >= *max {
    			return false
    		}
    		if !isValid(root.Right, &root.Val, max) {
    			return false
    		}
    	}
    	return true
    }
    
    // @lc code=end
    

    成绩:

    • Your runtime beats 95.6 % of golang submissions
    • Your memory usage beats 98.41 % of golang submissions (5.1 MB)

    「真诚赞赏,手留余香」

    Maolong’s Blog

    真诚赞赏,手留余香

    使用微信扫描二维码完成支付