LeetCode 98. 验证二叉搜索树

Problem: 验证二叉搜索树

题目描述:
给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

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

LeetCode原题传送

Solution

对于二叉搜索树BST,在中序遍历的时候会得到单调递增的序列,注意这里是严格意义上的单调递增(不存在相等的情况),按照这一特点笔者想到的最直接的方法是:中序遍历收集节点的值,再遍历数组判断是否是单调递增即可。

中序遍历再判断

由于是树的遍历,笔者更倾向于使用递归方式:

class Solution {
public:
	vector<int> ans;
	void recur(TreeNode* root) {
		if (root == nullptr)
			return;
		recur(root->left);
		ans.push_back(root->val);
		recur(root->right);
	}
	
	bool isValidBST(TreeNode* root) {
		recur(root);
		int n = ans.size();
		for (int i = 1; i < n; ++i)
			if (ans[i - 1] >= ans[i])
				return false;
		return true;
	}
};
先序遍历

在尝试使用了中序遍历之后,另一种相近的方式:先序遍历同样也能够解决本题,在代码实现的过程中遇上了一些问题:
首先很顺理成章地写出了下面这一段codes:

class Solution {
public:
	bool isValidBST(TreeNode* root) {
		if (root == nullptr)
			return false;
		if (root->left && root->left->val >= root->val)
			return false;
		if (root->right && root->right->val <= root->val)
			return false;
		return isValidBST(root->left) && isValidBST(root->right);
	}
};

写完之后成就感油然而生,然而在提交之后。。。。日常wrong answer。为什么会出错?在一番思索之后,我尝试了带入了一种情况,在这里插入图片描述
错在了右子树中,在这里3并没有与5比较而仅仅与6完成了比较,上述代码只能进行局部判断:
在这里插入图片描述
像上图标注的这样,仅仅是对局部的三个节点进行了判断,很显然这是不全面的。那怎样才能进行完整的判断?
在递归函数中加入一个边界:最大值最小值,递归过程中不断更新边界。

class Solution {
public:

	bool help(TreeNode* root, TreeNode* min, TreeNode* max) {
		if (root == nullptr)
			return true;
		if (min && root->val <= min->val)
			return false;
		if (max && root->val >= max->val)
			return false;
		return help(root->left, min,  root) && help(root->right, root, max);
	}

	bool isValidBST(TreeNode* root) {
		return help(root, nullptr, nullptr);
	}
};
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nepu_bin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值