力扣 驗證二叉搜尋樹(dfs或中序遍歷)
阿新 • • 發佈:2022-03-10
力扣 驗證二叉搜尋樹(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) }