LeetCode-098-驗證二叉搜尋樹

雄獅虎豹發表於2021-11-17

驗證二叉搜尋樹

題目描述:給定一個二叉樹,判斷其是否是一個有效的二叉搜尋樹。

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

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

示例說明請見LeetCode官網。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

解法一:遞迴法

根據二叉搜尋樹的性質,當前節點左子樹的上邊界(不包含)和右子樹的下邊界(不包含)是當前節點的值,所以可以用遞迴的方法來解決,遞迴過程如下:

  • 根節點沒有父結點,所以第一次呼叫遞迴方法上下邊界使用最大最小值;
  • 如果當前節點為null,說明是葉子節點,直接返回true;
  • 如果當前節點的值不在上下邊界範圍內,返回false;
  • 遞迴判斷當前節點的左右節點是否在相應的上線邊界範圍內。
import com.kaesar.leetcode.TreeNode;

public class LeetCode_098 {
    /**
     * 遞迴法
     *
     * @param root
     * @return
     */
    public static boolean isValidBST(TreeNode root) {
        return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
    }

    /**
     * 遞迴方法
     *
     * @param node 當前節點
     * @param low  當前節點的下邊界(不包含)
     * @param high 當前節點的上邊界(不包含)
     * @return
     */
    private static boolean isValidBST(TreeNode node, long low, long high) {
        // 如果node為null,說明是葉子節點,直接返回true
        if (node == null) {
            return true;
        }
        // 如果當前節點的值不在上下邊界範圍內,返回false
        if (node.val <= low || node.val >= high) {
            return false;
        }

        // 遞迴判斷當前節點的左右節點是否在相應的上線邊界範圍內
        return isValidBST(node.left, low, node.val) && isValidBST(node.right, node.val, high);
    }

    public static void main(String[] args) {
        TreeNode root = new TreeNode(5);
        root.left = new TreeNode(1);
        root.right = new TreeNode(4);
        root.right.left = new TreeNode(3);
        root.right.right = new TreeNode(6);

        System.out.println(isValidBST(root));
    }
}
【每日寄語】 生命不是用來尋找答案,不是用來解決問題,它是用來愉快地生活的。與其愁眉苦臉地去工作,不如寄工作於娛樂。努力的人萬歲!

相關文章