mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-08-06 09:29:56 +08:00
2.5 KiB
2.5 KiB
题目地址
思路
中序遍历下,输出的二叉搜索树节点的数值是有序序列,有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。
所以代码实现上,我们就使用递归法来中序遍历,遍历的过程中判断节点上的数值是不是递增的就可以了。
这道题目比较容易陷入两个陷阱:
10的右子树只能包含大于当前节点的数,而右面出现了一个6 这就不符合了!
- 陷阱2:样例中根节点的val 可能是int的最小值
问题可以进一步演进:如果样例中根节点的val 可能是longlong的最小值 又要怎么办呢?看下文解答!
C++代码
定于全局变量初始化为long long最小值
class Solution {
public:
long long maxVal = LONG_MIN;
bool isValidBST(TreeNode* root) {
if (root == NULL) return true;
bool left = isValidBST(root->left);
// 中序遍历,验证遍历的元素是不是从小到大
if (maxVal < root->val) maxVal = root->val;
else return false;
bool right = isValidBST(root->right);
return left && right;
}
};
其实因为后台数据有int最小值测试用例,所以都改成了longlong最小值。
如果测试数据中有 longlong的最小值,怎么办?不可能在初始化一个更小的值了吧。 建议避免 初始化最小值,如下方法取到最左面的数值:
class Solution {
public:
long long maxVal = 0; // 记录中序遍历的过程中出现过的最大值
bool flag = false; // 标记是否取到了最左面节点的数值
bool isValidBST(TreeNode* root) {
if (root == NULL) return true;
bool left = isValidBST(root->left);
if (!flag) {
maxVal = root->val;
flag = true;
} else {
// 中序遍历,这里相当于从大到小进行比较
if (maxVal < root->val) maxVal = root->val;
else return false;
}
bool right = isValidBST(root->right);
return left && right;
}
};
更多算法干货文章持续更新,可以微信搜索「代码随想录」第一时间围观,关注后,回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。