leetcode之98验证二叉搜索树Golang
二叉搜索树(BST)的特点是左子树的结点小于根结点小于右子树的结点,并且对于所有的子树都满足这个条件。
二叉树的中序遍历就是先遍历左子树的结点,再遍历中间根节点,最后遍历右子树的结点
因此,如果一棵树是BST,那么他的中序遍历结果必定是一个升序的结果
所以检查一棵树是不是一棵BST,只需要看中序遍历结果是不是升序的就可以了
代码如下:
func isValidBST(root *TreeNode) bool {
// 中序遍历整个二叉树,如果是搜索树,那么遍历的结果应该是一个升序
// 中序遍历的顺序是左、中、右
// 先设置int型的最小值
pre := ^int(^uint(0) >> 1)
var midTraverse func(treeNode *TreeNode) bool
midTraverse = func(treeNode *TreeNode) bool {
// 当当前结点不为空的时候,此时就有Val值
if treeNode != nil {
// 首先遍历左子树
flag := midTraverse(treeNode.Left)
if !flag {
return false
}
// 然后遍历中间结点
// 就算是和前一个结点的值相等也不行,因为这是搜索树,所以数据不能相等
if treeNode.Val <= pre {
return false
}
// 更新中序遍历的前一个结点
pre = treeNode.Val
// 最后遍历右子树
flag = midTraverse(treeNode.Right)
if !flag {
return false
}
}
// 到这个地方就返回true,两种情况可以到这个地方,
// 1是当当前结点为空
// 2是当前面的流程走完,也就是遍历完整个二叉树,还没有返回false,那么就返回true
return true
}
return midTraverse(root)
}
浙公网安备 33010602011771号