98.验证二叉搜索树

二叉搜索树的特点

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

思想

在中序递归遍历过程中判断。递归三部曲:

  • 确定递归函数、返回值、参数
  • 终止条件--依据二叉搜索树可以为空设定
  • 单层递归的逻辑--确保max_value < root->val(依据其中序遍遍历的特点)

注:采用中序遍历原因:中序遍历其结果是有序的,所以只要比较当前节点是不是大于前一节点的val

常见误区

  • 终止条件误判

        (root->val >root->left->val) && (root->val <root->right->val)

        上述终止条件仅判定当前中间节点的左右节点符合要求,而不是左右子树的所有节点符合要求

  •  采用max_value < root->val判定:存在关于全局变量max_val的初始化问题

      样例中最小节点 可能是int的最小值,也可能是long long 的最小值,无法统一,因此采用最左面节点代替初始化的最小值。

代码

bool isValidBST(TreeNode* root) {
        TreeNode* pre=NULL;
        if(root==NULL) return true;

        //中序遍历左子树
        bool left=isValidBST(root->left);
        //单层遍历逻辑--满足特点1,2
        if(pre!=NULL && root->val >= pre->val)//max_val > root->val  采用的是全局变量初始化比较值,需要进行初始化--陷阱1,2
        {
            return false;
        }
        else
        {   
            pre=root;//更新前一节点
        }
        //遍历右子树
        bool right=isValidBST(root->right);
        //满足特点3
        return left && right;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值