2021-02-21 验证二叉搜索树

本文探讨了两种方法来判断二叉搜索树的有效性:一是利用中序遍历的有序特性,二是通过递归地检查每个节点的值与其子树的边界。两种方法都涉及设置辅助变量来确保搜索树的单调性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目 验证二叉搜索树

给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:

  • 节点的左子树只包含小于当前节点的数。
  • 节点的右子树只包含大于当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

解1 中序遍历

由于二叉搜索树的中序遍历一定是一个升序的数组,因此中序遍历二叉树,并通过设置一个全局变量pNode记录遍历到的每个结点的上一个结点,如果pNode值 >= root的值,则说明不是二叉搜索树。
另外,在设置一个全局变量flag,判断遍历过程种是否右上述所说情况,若有,则停止遍历,一路返回false。

class Solution {
    bool flag = true;
    TreeNode* pNode = NULL;
public:
    bool isValidBST(TreeNode* root)
    {
        if(flag == false) return false;
        if(root == NULL) return true;
        if(root->left) isValidBST(root->left);
        if(pNode && root->val <= pNode->val)
            flag = false;
        pNode = root;
        if(root->right) isValidBST(root->right);
        return flag;
    }
};

解2 给出上下界值

class Solution {
public:
    bool isValidBST(TreeNode* root)
    {
    	//给出极限值
        return getSolution(root , LONG_MIN , LONG_MAX);
    }
    bool getSolution(TreeNode* root , long lower , long upper)
    {
        if(root == NULL) return true;
       	//如果不在范围内则返回false
        if(root->val <= lower || root->val >= upper)
            return false;
        //处理左子树,上值为该结点值
        //处理右子树,下值值为该结点值
        //返回两个相与的值
        return getSolution(root->left,lower , root->val) && getSolution(root->right,root->val , upper);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值