时间复杂度:O(n)
解题思路
思路很简单,就是模仿先序遍历,不过在遍历时需要记录下遍历结点后下一个结点所在的取值范围,在遍历下一个结点时判断是否满足这个范围,若不满足就返回false。
AC代码
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isValidBST(root *TreeNode) bool {
return isValid(root,math.MinInt64,math.MaxInt64)//必须是Int64,结点值可能为边界值
}
func isValid(root *TreeNode,min,max int)bool{
if root==nil{
return true
}
return root.Val>min&&root.Val<max&&isValid(root.Left,min,root.Val)&&isValid(root.Right,root.Val,max)
}
感悟
一开始没有仔细读题,写的代码是判断左右孩子是否小于和大于根节点,后来仔细读题才发现理解错题意了……