LeetCode98-驗證二叉搜索樹
最近全國疫情嚴重,待在家裏沒事幹,馬上又要準備春招了,最近刷刷題,記錄一下!再說一句,武漢加油,大家出門記得戴口罩!
1、題目
給定一個二叉樹,判斷其是否是一個有效的二叉搜索樹。
假設一個二叉搜索樹具有如下特徵:
- 節點的左子樹只包含小於當前節點的數。
- 節點的右子樹只包含大於當前節點的數。
- 所有左子樹和右子樹自身必須也是二叉搜索樹。
示例:
輸入:
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;
}
}
思路:自頂向下遞歸,引入上下邊界
- 對於樹的每個節點 val ,設其上下邊界 low , high。(用 long 防止 INT_MAX 溢出 )
- 判斷根結點時,須滿足 low < val < high ,否則返回 false
- 判斷左節點時,僅 上界 變化 ( 新上界爲 high 與 val 較小值。又因 val 必小於 high,故新上界爲 val )
- 判斷右節點時,僅 下界 變化 ( 同理,新下界爲 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);
}
}