力扣 验证二叉搜索树(dfs或中序遍历)

力扣 验证二叉搜索树(dfs或中序遍历)

题目链接:https://leetcode-cn.com/problems/validate-binary-search-tree/

题目的意思就是验证一棵树是不是二叉搜索树
二叉搜索树的特征就是左孩子值小于根节点值,右孩子值大于根节点值

解析:

  • 方法1就是进行一遍中序遍历,如果得到的序列是升序的,那么该树是二叉搜索树
  • 方法2:
    • 从根节点开始搜索,每个节点都当做根节点,根节点值不能小于最小值,不能大于最大值,每次根据搜索方向改变当前最大最小值即可
    • 当搜索左子树时,最大值就是根节点值
    • 当搜索右子树时,最小值就是根节点值

时间复杂度:O(N),N个节点都要遍历一遍

空间复杂度:O(N),方法2当树退化成链表时递归需要O(N)栈空间,方法1需要额外存储遍历结果

  • 中序遍历
var ans []int
func dfs(root *TreeNode) {
	if root==nil{
		return
	}
	if root.Left!=nil{
		dfs(root.Left)
	}
	
	ans=append(ans,root.Val)
	
	if root.Right!=nil{
		dfs(root.Right)
	}
}

func isValidBST(root *TreeNode) bool {
	ans=[]int{}
	dfs(root)
	flag:=true
	for i:=0;i<len(ans)-1;i++{
		if ans[i]>=ans[i+1] {
			flag=false
			break
		}
	}
	return flag
}
  • dfs
func dfs(root *TreeNode,minValue,maxValue int) bool{
	if root==nil{
		return true
	}
	if root.Val<=minValue||root.Val>=maxValue{
		return false
	}
	return dfs(root.Left,minValue,root.Val) && dfs(root.Right,root.Val,maxValue)
}

func isValidBST(root *TreeNode) bool {
	return dfs(root,math.MinInt64,math.MaxInt64)
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章