1. 程式人生 > 其它 >LeetCode98. 驗證二叉搜尋樹

LeetCode98. 驗證二叉搜尋樹

技術標籤:java~~演算法

題目:

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

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

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

示例 1:

輸入:
    2
   / \
  1   3
輸出: true

示例 2:

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

思路1:利用二叉搜尋樹的特點,左子樹都小於根節點,右子樹都大於根節點,利用好遞迴進行判斷

public boolean isValidBST(TreeNode root) {
    return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}

public boolean isValidBST(TreeNode root, long minVal, long maxVal) {
    if (root == null)
        return true;
    //每個節點如果超過這個範圍,直接返回false
    if (root.val >= maxVal || root.val <= minVal)
        return false;
    //這裡再分別以左右兩個子節點分別判斷,
    //左子樹範圍的最小值是minVal,最大值是當前節點的值,也就是root的值,因為左子樹的值要比當前節點小
    //右子數範圍的最大值是maxVal,最小值是當前節點的值,也就是root的值,因為右子樹的值要比當前節點大
    return isValidBST(root.left, minVal, root.val) && isValidBST(root.right, root.val, maxVal);
}

思路2:利用二叉搜尋樹的中序遍歷,左-跟-右 然後會得到一個有序的陣列,之需要保留前一個數值,如果後一個小於前一個數值則不是二叉搜尋樹

class Solution {
 
    public boolean isValidBST(TreeNode root) {
       return  isBST(root);
    }

    //前一個結點,全域性的
    TreeNode prev;

    public boolean isBST(TreeNode root) {
    if (root == null)
        return true;
    //訪問左子樹
    if (!isBST(root.left))
        return false;
    //訪問當前節點:如果當前節點小於等於中序遍歷的前一個節點直接返回false。
    if (prev != null && prev.val >= root.val)
        return false;
    prev = root;
    //訪問右子樹
    if (!isBST(root.right))
        return false;
    return true;
    }
}

想獲得更多內容,歡迎關注博主公眾號: