LeetCode98-驗證二叉搜索樹

LeetCode98-驗證二叉搜索樹

最近全國疫情嚴重,待在家裏沒事幹,馬上又要準備春招了,最近刷刷題,記錄一下!再說一句,武漢加油,大家出門記得戴口罩!

1、題目

給定一個二叉樹,判斷其是否是一個有效的二叉搜索樹。
假設一個二叉搜索樹具有如下特徵:

  1. 節點的左子樹只包含小於當前節點的數。
  2. 節點的右子樹只包含大於當前節點的數。
  3. 所有左子樹和右子樹自身必須也是二叉搜索樹。
    示例:
輸入:
    2
   / \
  1   3
輸出: true
輸入:
    5
   / \
  1   4
     / \
    3   6
輸出:false
解釋:輸入是 5,1,4,null,null,3,6]. 根節點的值是5,
      但其右兒子的值是4。

2、思路

首先,這是 TreeNode 的定義,後續會使用到。

// Definition for a binary tree node.
public class TreeNode {
  int val;
  TreeNode left;
  TreeNode right;

  TreeNode(int x) {
    val = x;
  }
}

思路:自頂向下遞歸,引入上下邊界

  1. 對於樹的每個節點 val ,設其上下邊界 low , high。(用 long 防止 INT_MAX 溢出 )
  2. 判斷根結點時,須滿足 low < val < high ,否則返回 false
  3. 判斷左節點時,僅 上界 變化 ( 新上界爲 high 與 val 較小值。又因 val 必小於 high,故新上界爲 val )
  4. 判斷右節點時,僅 下界 變化 ( 同理,新下界爲 val )

3、代碼

c++

class Solution {
public:
    bool isValidBST(TreeNode* root) {
        return dfs(root, LONG_MIN, LONG_MAX);
    }
    bool dfs(TreeNode* root,long long low,long long high)
    {
        if(root==NULL) return true;
        long long num=root->val;
        if(num<=low||num>=high) return false;
        return dfs(root->left,low,num)&&dfs(root->right,num,high);
    }
};

Java

class Solution {
    public boolean isValidBST(TreeNode root) {
        return dfs(root,null,null);
    }
    public boolean dfs(TreeNode root,Integer lower,Integer upper) {
        if(root==null) return true;
        int val=root.val;
        if(lower != null && val <= lower) return false;
        if (upper != null && val >= upper) return false;
        return dfs(root.left,lower,val)&&dfs(root.right,val,upper);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章