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