1. 程式人生 > 實用技巧 >leetcode刷題筆記九十八題 驗證二叉搜尋樹

leetcode刷題筆記九十八題 驗證二叉搜尋樹

leetcode刷題筆記九十八題 驗證二叉搜尋樹

源地址:98. 驗證二叉搜尋樹

問題描述:

給定一個二叉樹,判斷其是否是一個有效的二叉搜尋樹。

假設一個二叉搜尋樹具有如下特徵:

節點的左子樹只包含小於當前節點的數。
節點的右子樹只包含大於當前節點的數。
所有左子樹和右子樹自身必須也是二叉搜尋樹。
示例 1:

輸入:
2
/
1 3
輸出: true
示例 2:

輸入:
5
/
1 4
/
3 6
輸出: false
解釋: 輸入為: [5,1,4,null,null,3,6]。根節點的值為 5 ,但是其右子節點值為 4 。

/**
本題有兩種解法,一種是遞迴, 一種是中序遍歷
遞迴過程需要注意,由於二叉搜尋樹的性質是root大於左子樹小於右子樹,直接比較當前結點的左右子樹並不合理,需要設定一個lower和upper上下界並更新
*/
/**
 * Definition for a binary tree node.
 * class TreeNode(var _value: Int) {
 *   var value: Int = _value
 *   var left: TreeNode = null
 *   var right: TreeNode = null
 * }
 */
object Solution {
    def isValidBST(root: TreeNode): Boolean = {
        def helper(root: TreeNode, upper: Long, lower: Long): Boolean = {
            if (root == null) return true
            val cur = root.value
            if (lower != Long.MinValue && cur <= lower)  return false
            if (upper != Long.MinValue && cur >= upper)  return false
            if (helper(root.left, cur, lower) == false) return false
            if (helper(root.right, upper, cur) == false) return false
            return true
        }
        return helper(root, Long.MaxValue, Long.MinValue)
    }
}

/**
中序遍歷的情況下,由於二叉搜尋樹的性質,獲取的結點依序嚴格遞增,這樣我們可以設定一個lower與root.value比較,如果大於等於就返回false,否則更新lower,比較下一個結點
*/
/**
 * Definition for a binary tree node.
 * class TreeNode(var _value: Int) {
 *   var value: Int = _value
 *   var left: TreeNode = null
 *   var right: TreeNode = null
 * }
 */
object Solution {
    def isValidBST(root: TreeNode): Boolean = {
        var lower = Long.MinValue
        def helper(root: TreeNode): Boolean = {
            if (root != null){
                if (root.left != null &&  helper(root.left) == false) return false
                if(root.value <= lower) return false
                lower = root.value
                if(root.right != null &&  helper(root.right) == false) return false
            }
            return true
        }
        return helper(root)
    }
}