题目描述
给你一个二叉树的根节点 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
代码及注释
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isValidBST(root *TreeNode) bool {
// 初始化一个栈和一个最小值,用于迭代遍历二叉树和比较节点值
var stack []*TreeNode
minNum := 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 <= minNum {
return false
}
// 更新最小值为当前节点值
minNum = root.Val
// 处理右子节点
root = root.Right
}
// 如果遍历完成并且都满足条件,则返回 true
return true
}
代码解释
- 使用中序遍历来遍历BST。在中序遍历的过程中,节点的值应该是递增的。
- 使用一个栈来迭代遍历二叉树。
- 使用一个最小值变量(
minNum
)来存储上一个遍历的节点值,以便与当前节点的值进行比较。