題目
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。
假設乙個二叉搜尋樹具有如下特徵:
輸入:
2/ \ 1
3輸出:true
示例2:
輸入:
5/ \ 1
4/ \
36輸出:false
解釋:輸入為:[5
,1,4
,null,null,3,
6]。根節點的值為 5 ,但是其右子節點值為 4 。
輸出: false
解釋:輸入為: [5,1,4,null,null,3,6]。
根節點的值為 5 ,但是其右子節點值為 4 。
思路:**
方法1:
20
/ \ 10
30 \
25這個返回的是true,但顯然不是二叉搜尋樹。
最後參考了別人的**,新增了乙個最大最小值,來限定每個節點的有效取值範圍。假設任一根節點root的取值範圍為(min,max),則左子女的取值範圍為(min,root.val),右子女的取值範圍是(root.val,max),依次執行下去,一旦檢測到節點值不在這個範圍則返回 false。真是太機智了。還有就是在傳輸過程中原函式不能夠傳遞最大最小值,又重新定義了乙個函式呼叫,值得學習。
public
boolean
isvalidbst
(treenode root)
public
boolean
subtree
(treenode root,
long min,
long max)
if(root.valmin
&&subtree
(root.left,min,root.val)
&&subtree
(root.right,root.val,max)
)else
}
方法2:二叉搜尋樹的中序遍歷結果是乙個嚴格遞增的序列,利用這一約束條件也可以判斷是否是二叉搜尋樹。
class
solution
public
boolean
inorder
(treenode root)
return
true;}
}
總結:
以上兩種方法的時間複雜度都是o(n),遞迴的空間複雜度也都是o(logn)。
驗證二叉搜尋樹
題目 給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 1 3 輸出 true 示例 2 輸入 5 1 4 3 6 輸出 false ...
驗證二叉搜尋樹
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 1 3 輸出 true示例 2 輸入 5 1 4 3 6 輸出 false 解釋 輸...
驗證二叉搜尋樹
leetcode 98題 給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。必然從二叉搜尋樹的特性出發。容易知道,二叉搜尋樹的中序遍歷是乙個遞增的陣列。所...