騰訊電競釋出防假賽公約,要建立黑名單資料庫
阿新 • • 發佈:2021-06-20
LeetCode98. 驗證二叉搜尋樹
題目描述
/**
* 給定一個二叉樹,判斷其是否是一個有效的二叉搜尋樹。
* <p>
* 假設一個二叉搜尋樹具有如下特徵:
* <p>
* 節點的左子樹只包含小於當前節點的數。
* 節點的右子樹只包含大於當前節點的數。
* 所有左子樹和右子樹自身必須也是二叉搜尋樹。
*/
思路分析
- 驗證二叉搜尋樹,首先需要理解滿足二叉搜尋樹的條件,即當前節點的左子樹的所有元素的值都小於當前節點的值,當前節點的右子樹的所有元素的值都大於當前節點的值,當前節點的左子樹和右子樹也必須是二叉搜尋樹
- 定義兩個變數確定一個範圍,表示當前節點元素的值應該滿足的範圍,如果是左子樹的左子節點,則應該直接小於父節點的值,如果是右子節點,則應該大於當前節點的直接父節點,而小於樹的根節點
- 如果是右子樹的左子節點,則應該小於當前節點的直接父節點的值,並且大於該樹根節點的值,如果是右子節點,則直接大於當前父節點的值即可
- 編寫一個遞迴函式實現上述功能,並向左向右遞迴
- 原始碼見下
原始碼及分析
/** * * @param root 根節點 * @return */ public boolean isValidBST(TreeNode root) { //初始最小最大值為Long對應的最小最大值 return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE); } /** * 功能:判斷以root為根節點的子樹的左右節點是否在指定的範圍 * * @param root 二叉樹根節點 * @param lower 以root為根節點的滿足二叉搜尋樹的最小值 * @param upper 最大值 * @return 返回判斷的結果 */ public boolean isValidBST(TreeNode root, long lower, long upper) { //如果根節點為空 if (root == null) { return true; } //如果當前節點的值不滿足二叉搜尋樹的條件 if (!(root.val > lower && root.val < upper)) { return false; } //向左向右遞迴判斷 return isValidBST(root.left, lower, root.val) && isValidBST(root.right, root.val, upper); }