【LeetCode】98. 验证二叉搜索树

思路

  1. 这道题乍一看,觉得挺简单,但是有一个点比较容易忽略,例如下面这个用例
    5
   / \
  1   4
     / \
    3   6

对于3这个节点,虽然满足小于4,但是作为5的右子树,其所有子节点都应该大于5,因此这棵树不是二叉搜索树。

  1. 很自然想到采用递归的方式
  2. 通过记录上下限的方式,保证子树上所有节点满足要求,递归至右子树时,更新下限,递归至左子树时更新上限。
  3. 最左节点和最右节点分别没有下限和上限,可以使用一个标记来表示,或者定义一个魔术字,本例中采用定义一个结构体的方式。

代码

#define True    1
#define False   0
#define UPPER   1
#define LOWER   (-1)

typedef struct tag_Limit
{
    char flag;
    int limit;
}Limit;

bool RecursionJudge(struct TreeNode *root, Limit upper, Limit lower )
{
    Limit upperLeft;
    Limit lowerRitht;
    if (!root) {
        return True;
    }
    if (upper.flag == UPPER && root->val >= upper.limit)
        return false;
    if (lower.flag == LOWER && root->val <= lower.limit)
        return false;
    upperLeft.flag = UPPER;
    upperLeft.limit = root->val;

    lowerRitht.flag = LOWER;
    lowerRitht.limit = root->val;

    bool relt = RecursionJudge(root->left, upperLeft, lower) && RecursionJudge(root->right, upper, lowerRitht);

    return relt;

}
bool isValidBST(struct TreeNode* root)
{
    if(!root) {
        return True;
    }
    Limit upper;
    Limit lower;
    upper.flag = 0;
    upper.limit = 0;
    lower.flag = 0;
    lower.limit = 0;
    return RecursionJudge(root, upper, lower);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值