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)
}

  

 

posted @ 2020-09-27 18:45  胖胖咩  阅读(198)  评论(0)    收藏  举报