1. 程式人生 > 資訊 >騰訊電競釋出防假賽公約,要建立黑名單資料庫

騰訊電競釋出防假賽公約,要建立黑名單資料庫

LeetCode98. 驗證二叉搜尋樹

題目描述

/**
     * 給定一個二叉樹,判斷其是否是一個有效的二叉搜尋樹。
     * <p>
     * 假設一個二叉搜尋樹具有如下特徵:
     * <p>
     * 節點的左子樹只包含小於當前節點的數。
     * 節點的右子樹只包含大於當前節點的數。
     * 所有左子樹和右子樹自身必須也是二叉搜尋樹。
     */

思路分析

  1. 驗證二叉搜尋樹,首先需要理解滿足二叉搜尋樹的條件,即當前節點的左子樹的所有元素的值都小於當前節點的值,當前節點的右子樹的所有元素的值都大於當前節點的值,當前節點的左子樹和右子樹也必須是二叉搜尋樹
  2. 定義兩個變數確定一個範圍,表示當前節點元素的值應該滿足的範圍,如果是左子樹的左子節點,則應該直接小於父節點的值,如果是右子節點,則應該大於當前節點的直接父節點,而小於樹的根節點
  3. 如果是右子樹的左子節點,則應該小於當前節點的直接父節點的值,並且大於該樹根節點的值,如果是右子節點,則直接大於當前父節點的值即可
  4. 編寫一個遞迴函式實現上述功能,並向左向右遞迴
  5. 原始碼見下

原始碼及分析

/**
     *
     * @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);
    }