給定一個二叉樹,判斷其是否是一個有效的二叉搜索樹。
假設一個二叉搜索樹具有如下特徵:
- 節點的左子樹只包含小於當前節點的數。
- 節點的右子樹只包含大於當前節點的數。
- 所有左子樹和右子樹自身必須也是二叉搜索樹。
示例 1:
輸入: 2 / \ 1 3 輸出: true
示例 2:
輸入:
5
/ \
1 4
/ \
3 6
輸出: false
解釋: 輸入爲: [5,1,4,null,null,3,6]。
根節點的值爲 5 ,但是其右子節點值爲 4 。
📖文字題解
方法一: 遞歸
思路和算法
要解決這道題首先我們要了解二叉搜索樹有什麼性質可以給我們利用,由題目給出的信息我們可以知道:如果該二叉樹的左子樹不爲空,則左子樹上所有節點的值均小於它的根節點的值; 若它的右子樹不空,則右子樹上所有節點的值均大於它的根節點的值;它的左右子樹也爲二叉搜索樹。
這啓示我們設計一個遞歸函數 helper(root, lower, upper) 來遞歸判斷,函數表示考慮以 root 爲根的子樹,判斷子樹中所有節點的值是否都在 (l,r) 的範圍內(注意是開區間)。如果 root 節點的值 val 不在 (l,r) 的範圍內說明不滿足條件直接返回,否則我們要繼續遞歸調用檢查它的左右子樹是否滿足,如果都滿足才說明這是一棵二叉搜索樹。
那麼根據二