1. 程式人生 > 其它 >力扣 驗證二叉搜尋樹(dfs或中序遍歷)

力扣 驗證二叉搜尋樹(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)
}