1. 题目

2. 解答

2.1. 方法一

我们初始化根节点的范围为长整形数据的最小最大值 \([LONG\_MIN,LONG\_MAX]\),则其左子节点的取值范围为 \([LONG\_MIN,根节点值]\),右子节点的取值范围为 \([根节点值,LONG\_MAX]\)。

以此类推,可以得到,如果父节点的取值范围为 \([min, max]\),则其左子节点的取值范围为 \([min,父节点值]\),右子节点的取值范围为 \([父节点值,max]\)。

如果节点值在上述的范围内,则为二叉搜索树,反之则不是。

class Solution {
public:
bool isValidBST(TreeNode* root, long min_value=LONG_MIN, long max_value=LONG_MAX) { if (root == NULL) return true; if (root->val <= min_value || root->val >= max_value) return false;
else return(isValidBST(root->left, min_value, root->val) && isValidBST(root->right, root->val, max_value));
} };
2.2. 方法二

二叉搜索树中序遍历输出的是一个升序序列,我们可以在遍历的时候判断是否升序即可。

class Solution {
public:
bool isValidBST(TreeNode* root) { if (root == NULL) return true; stack<TreeNode *> s;
TreeNode *prev = NULL;
while (root || !s.empty())
{
while (root)
{
s.push(root);
root = root->left;
} root = s.top();
// 判断当前节点值是否比上一个节点值大
if (prev && prev->val >= root->val) return false;
prev = root;
s.pop();
root = root->right;
} return true;
}
};
2.3. 方法三

针对一个节点,有下列四种情况:

  • 节点为空或者节点的左右节点都为空;
  • 只有右结点为空;
  • 只有左结点为空;
  • 左右结点都不为空;

如果当前节点的左右子节点值满足二叉搜索树的条件,我们可以递归判断左右子树是否为二叉搜索树。如果左右子树也满足二叉搜索树条件,同时左子树最大节点(也即前驱结点)值小于当前节点值,右子树最小节点(也即后继结点)值大于当前节点值,那么整棵树即为二叉搜索树。

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isValidBST(TreeNode* root) { if (root == NULL || (root->left == NULL && root->right == NULL)) return true;
else if (root->left != NULL && root->right == NULL)
{
if (root->left->val >= root->val) return false;
else return isValidBST(root->left) && isValidprev_node(root->left, root->val);
}
else if (root->left == NULL && root->right != NULL)
{
if (root->right->val <= root->val) return false;
else return isValidBST(root->right) && isValidnext_node(root->right, root->val);
}
else
{
if (root->right->val <= root->val || root->left->val >= root->val) return false;
else return isValidBST(root->left) && isValidprev_node(root->left, root->val)
&& isValidBST(root->right) && isValidnext_node(root->right, root->val);
}
} // 前驱节点是否有效
bool isValidprev_node(TreeNode* root, int data)
{
while (root->right != NULL)
{
root = root->right;
}
if (root->val < data) return true;
else return false;
}
// 后继节点是否有效
bool isValidnext_node(TreeNode* root, int data)
{
while (root->left != NULL)
{
root = root->left;
}
if (root->val > data) return true;
else return false;
} };

获取更多精彩,请关注「seniusen」!

LeetCode 98——验证二叉搜索树的更多相关文章

  1. LeetCode 98. 验证二叉搜索树 | Python

    98. 验证二叉搜索树 题目来源:https://leetcode-cn.com/problems/validate-binary-search-tree 题目 给定一个二叉树,判断其是否是一个有效的 ...

  2. Java实现 LeetCode 98 验证二叉搜索树

    98. 验证二叉搜索树 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右 ...

  3. 力扣Leetcode 98. 验证二叉搜索树

    验证二叉搜索树 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身 ...

  4. LeetCode 98 验证二叉搜索树

    题目: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是 ...

  5. Leetcode 98 验证二叉搜索树 Python实现

    给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二叉搜索 ...

  6. LeetCode 98. 验证二叉搜索树(Validate Binary Search Tree)

    题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也 ...

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

    LeetCode:验证二叉搜索树[98] 题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当 ...

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

    98. 验证二叉搜索树 知识点:二叉树:递归 题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大 ...

  9. 98. 验证二叉搜索树 前序遍历解法以及后续遍历解法(go语言)

    leetcode题目 98. 验证二叉搜索树 前序遍历 最简洁的答案版本,由于先判断的是根节点,所以直接判断当前root的值v,是否满足大于左子树最大,小于右子树最小,然后再遍历左子树,右子树是否是这 ...

随机推荐

  1. Swift_类和结构体

    Swift_类和结构体 点击查看源码 struct Resolution { var width = 0 var height = 0 } class VideoMode { var resoluti ...

  2. CF1066B Heaters(贪心)

    题意描述: Vova先生的家可以看作一个n×1的矩形,寒冷的冬天来了,Vova先生想让他的家里变得暖和起来.现在我们给你Vova先生家的平面图,其中111表示这个地方是加热炉,0表示这个地方什么也没有 ...

  3. SQL:登录、连接数据库基本操作

    使用MySQL 登录.连接数据库 win+R打开控制台,cmd进入控制台,输入mysql -u root -p,后输入密码,进入数据库: 首先可以查看原有的数据库,输入 show databases; ...

  4. WebService 学习笔记(一、概念及定义)

    定义 WebService是一种服务导向架构(SOA service-oriented architecture)的技术,通过标准的Web协议提供服务,目的是保证不同平台的应用服务可以互操作. Web ...

  5. Java线程池的创建详解

    本篇文章主要总结了Java创建线程池的三种方式以及线程池参数的详细说明,对线程池感兴趣的同学可以作为参考学习. 1)通过工具类java.util.concurrent.Executors的静态方法来创 ...

  6. HTML+css 文字只显示一行

    电脑端 设置行高,超出隐藏 p{ width: 80%; height: 16px; line-height: 16px; display: block; overflow: hidden; text ...

  7. windows10下“sqlplus / as sysdba”执行提示无权限解决办法

    ORA_DBA:是ORACLE 的特有用户,是超级管理员权限,建成DBA 它具有管理数据库的最高权限. 注明:需要以管理员身份运行cmd,不然第4步会失败(点开始,输入cmd,右键以管理员身份运行) ...

  8. 【Java】集合遍历--List和Map的多种遍历方式

    1. List的两种遍历方式 package com.nova.test; import java.util.ArrayList; import java.util.Iterator; import ...

  9. Ruby中的类

    初识ruby中的类 只需要简单的两行 class Point end 如果我们此时实例化一个类那么他会有一些自省(introspection)的方法 p = Point.new p.methodes( ...

  10. 《HTML与CSS知识》系列分享专栏

    收藏HTML和CSS方面的技术文章,作为一个WEB开发者,必须要知道HTML和CSS方面的知识,即使作为后台开发者也应该知道一些常用的HTML和CSS知识,甚至架构师也要了解,这样才会开发出实用的网站 ...