LeetCode 98——验证二叉搜索树
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——验证二叉搜索树的更多相关文章
- LeetCode 98. 验证二叉搜索树 | Python
98. 验证二叉搜索树 题目来源:https://leetcode-cn.com/problems/validate-binary-search-tree 题目 给定一个二叉树,判断其是否是一个有效的 ...
- Java实现 LeetCode 98 验证二叉搜索树
98. 验证二叉搜索树 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右 ...
- 力扣Leetcode 98. 验证二叉搜索树
验证二叉搜索树 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身 ...
- LeetCode 98 验证二叉搜索树
题目: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是 ...
- Leetcode 98 验证二叉搜索树 Python实现
给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二叉搜索 ...
- LeetCode 98. 验证二叉搜索树(Validate Binary Search Tree)
题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也 ...
- LeetCode:验证二叉搜索树【98】
LeetCode:验证二叉搜索树[98] 题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当 ...
- 【LeetCode】98. 验证二叉搜索树
98. 验证二叉搜索树 知识点:二叉树:递归 题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大 ...
- 98. 验证二叉搜索树 前序遍历解法以及后续遍历解法(go语言)
leetcode题目 98. 验证二叉搜索树 前序遍历 最简洁的答案版本,由于先判断的是根节点,所以直接判断当前root的值v,是否满足大于左子树最大,小于右子树最小,然后再遍历左子树,右子树是否是这 ...
随机推荐
- List、LinkedList、ArrayList、Vector
目前好像写不出比较高质量的随笔,除了多看看别人写的,就是多写,做好自己可以做的 最近听的和看到的最多的一个词就是“勿忘初心”.的确不少人到了一定高度之后,就不知道该怎么做了.(包括我曾经的偶像娜姐,在 ...
- Linux下抓取登陆用户密码神器mimipenguin
windows下有Mimikatz,现在linux下有了mimipenguin,国外安全研究员huntergregal发布了工具mimipenguin,一款Linux下的密码抓取神器,弥补了Linux ...
- 将图片写入二进制文件,再从二进制文件还原图片(c++)
#include "string" #include "iostream" #include "fstream" using namespa ...
- 安装psutil时提示缺少python.h头文件(作记录)
通过pip或者源码安装psutil,都会提示缺少python.h头文件,错误提示如下: ... psutil/_psutil_common.c:9:20: fatal error: Python.h: ...
- echarts 点击方法总结,点任意一点获取点击数据,举例说明:在多图联动中点击绘制标线
关于点击(包括左击,双击,右击等)echarts图形任意一点,获取相关的图形数据,尤其是多图,我想部分人遇到这个问题一直很头大.下面我用举例说明,如何在多图联动基础上,我们点击任意一个图上任意一点,在 ...
- 【Java】abstract,final,static,private,protected,public的区别
[abstract]抽象的 1. abstract可以修饰类和成员方法,被abstract修饰的类称为抽象类,被abstract修饰成员方法叫抽象方法.抽象类不一定有抽象方法,但拥有抽象方法的类一定是 ...
- delphi 2010以上 安装 第三方控件
delphi-“can't be installed because it is not a design time package. 一定要先装 dcl*.dpk ----------------- ...
- Docker开篇之HelloWorld
按照程序世界的惯例,我们应该以HelloWorld的程序为起点开始介绍.那么接下来我们就看看Docker的HelloWorld是如何运行的. 安装 Docker CE 由于我的系统是OSX,个人推荐使 ...
- 北京Uber优步司机奖励政策(12月14日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 算法------------数组----------------两个数组的交集 II
给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5 ...