坚持按题型打卡&刷&梳理力扣算法题系列,语言为go,Day17
验证二叉搜索树
- 题目描述
- 解题思路
- 前序遍历:先访问节点值,再访问左右子树
- 有效二叉搜索树的定义
- 节点的左子树只包含小于当前节点的数
- 节点的右子树只包含大于当前节点的数
- 所有的左子树和右子树本身必须也是二叉搜索树
- 根节点的值的范围是负无穷到正无穷
- 代码参考
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func dfs(root *TreeNode, left int, right int) bool {
if root==nil{
return true
}
return left<root.Val && root.Val<right && dfs(root.Left,left,root.Val) && dfs(root.Right,root.Val,right)
}
func isValidBST(root *TreeNode) bool {
return dfs(root,math.MinInt,math.MaxInt)
}
- tips
- 边界条件是当前为空节点
- 只要分别递归判断左右子树的节点值是否都分别满足区间值范围即可
- 注意:go中不能出现连续的大小比较,必须写成left<root.Val && root.Val<right
- 注意:负无穷和正无穷的表示分别为math.MinInt和math.MaxInt(注意math是全小写)
- 解法2:中序遍历(左-中-右的顺序遍历)
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isValidBST(root *TreeNode) bool {
pre := math.MinInt
var dfs func(*TreeNode) bool
dfs = func(node *TreeNode) bool{
if node == nil{
return true
}
//此处不能直接写return 只能判断false需要返回,true的话需要接着执行后面的
if !dfs(node.Left) || node.Val <= pre {
return false
}
pre = node.Val
return dfs(node.Right)
}
return dfs(root)
}