​LeetCode刷题实战98:验证二叉搜索树

共 1697字,需浏览 4分钟

 ·

2020-11-18 01:43

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 验证二叉搜索树,我们先来看题面:

https://leetcode-cn.com/problems/validate-binary-search-tree/

Given a binary tree, determine if it is a valid binary search tree (BST).


Assume a BST is defined as follows:


The left subtree of a node contains only nodes with keys less than the node's key.

The right subtree of a node contains only nodes with keys greater than the node's key.

Both the left and right subtrees must also be binary search trees.


题意

给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
  • 节点的左子树只包含小于当前节点的数。

  • 节点的右子树只包含大于当前节点的数。

  • 所有左子树和右子树自身必须也是二叉搜索树。


样例


解题


我们都知道二叉搜索树:中序遍历为严格的递增序列。
所以我们可以使用中序遍历的递归遍历这个二叉树,并且实时更新当前中序遍历到的最大值,如果正在判断的节点的val不大于这个实时的最大值,那就说明这个二叉树的中序遍历不是严格递增的,继而判定这个二叉树不是二叉搜索树。

class Solution {
public:
  long long maxValue = LLONG_MIN;//中序遍历的当前最大值
  bool isValidBST(TreeNode* root) {
    if (root == NULL){
      return true;
    }
    if (!isValidBST(root->left)){//首先判断左子树是否是搜索二叉树
      return false;
    }
    if (root->val <= maxValue){//如果发现不大于之前的遇到的最大值,说明中序遍历不是严格的递增
      return false;
    }
    maxValue = root->val;//更新中序遍历到此时,遇到的最大值
    if (!isValidBST(root->right)){//首先判断右子树是否是搜索二叉树
      return false;
    }
    return true;
  }
};


好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力。


上期推文:

LeetCode50-80题汇总,速度收藏!
LeetCode刷题实战81:搜索旋转排序数组 II
LeetCode刷题实战82:删除排序链表中的重复元素 II
LeetCode刷题实战83:删除排序链表中的重复元素
LeetCode刷题实战84: 柱状图中最大的矩形
LeetCode刷题实战85:最大矩形
LeetCode刷题实战86:分隔链表
LeetCode刷题实战87:扰乱字符串
LeetCode刷题实战88:合并两个有序数组
LeetCode刷题实战89:格雷编码
LeetCode刷题实战90:子集 II
LeetCode刷题实战91:解码方法
LeetCode刷题实战92:反转链表 II
LeetCode刷题实战93:复原IP地址
LeetCode刷题实战94:二叉树的中序遍历
LeetCode刷题实战95:不同的二叉搜索树 II
LeetCode刷题实战96:不同的二叉搜索树
LeetCode刷题实战97:交错字符串

浏览 19
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报