leetcode刷題筆記九十八題 驗證二叉搜尋樹
阿新 • • 發佈:2020-07-31
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) } }