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. JS异步编程 (2) - Promise、Generator、async/await

    JS异步编程 (2) - Promise.Generator.async/await 上篇文章我们讲了下JS异步编程的相关知识,比如什么是异步,为什么要使用异步编程以及在浏览器中JS如何实现异步的.最 ...

  2. NodeJ node.js Koa2 跨域请求

    Koa2 .3 跨域请求 Haisen's  需求分析 (localhost:8080 = 前端  [请求]  localhost:8081 = 服务器 ) 1.一个前台    一个服务器    前台 ...

  3. 在vue-cli + webpack 项目中使用sass

    1.准备工作: 由于npm的服务器在国外,网速慢而且安装容易失败,建议在安装之前,先安装国内的镜像,比如淘宝镜像 npm install -g cnpm --registry=https://regi ...

  4. SQL Server公用表达式CET递归查询所有上级数据

    with cte as( select bianma,fjbm from #tree where chkDisabled='true' union all select t.bianma,t.fjbm ...

  5. [SHELL]软件管理

  6. 简单json---转树形json

    var data = [ {"fileName":"navone","layFilterId":"layadmin-system- ...

  7. 使用JDK开发WebServrice案例

    使用JDK开发WebServrice案例: 一.开发WebService服务器端 第一步:创建Java工程 ,创建相应的包(服务端)使用JDK开发(1.6以上版本) 第二步:建一个接口WebServi ...

  8. MySQL---数据表基本操作(增删改查、排序、分组、连表)

    一.表操作 1.创建表 create table 表名( 列名 类型 是否可以为空, 列名 类型 是否可以为空 )ENGINE=InnoDB DEFAULT CHARSET=utf8 是否可空,nul ...

  9. 支付宝支付示例-python

    项目演示: 1.输入金额 ​ 2.扫码支付: ​ 3.支付完成: ​ ​ 具体操作步骤: 第一步:注册账号 https://openhome.alipay.com/platform/appDaily. ...

  10. flask第三方插件WTForms

    在django中有ModelForm, 虽然flask原生没有提供, 但是强大的第三方也提供了这样的功能 虽然不如django的强大, 但是基本的功能还是可以有的, 下面就来使用一哈. WTForms ...