Day46[26/4/15]T98验证二叉搜索树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 严格小于 当前节点的数。
- 节点的右子树只包含 严格大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:root = [2,1,3]
输出:true
示例 2:
输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。
提示:
- 树中节点数目范围在
[1, 104]内 -231 <= Node.val <= 231 - 1
解题思路
中序遍历,并且保证遍历的时候,相邻两次访问的数字符合严格升序。
因为要对两个数据进行比较,所以递归函数需要接受两个参数,此外还必须注意一点,由于要保存上一次的结果,所以需要一个固定的指针来保存,所以函数签名里面一定要注意 & ,这个是最最大的坑:
bool check(TreeNode *root, TreeNode *&prev)
Code
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution
{
public:
bool isValidBST(TreeNode *root)
{
if (root == nullptr)
{
return true;
}
// 指向上一个节点
TreeNode *prev = nullptr;
// 1. 中序遍历,升序即可
return check(root, prev);
}
private:
bool check(TreeNode *root, TreeNode *&prev)
{
if (root == nullptr)
{
return true;
}
// 1. 中序遍历,先左,再访问自己,最后访问右侧
if (check(root->left, prev) == false)
{
return false;
}
if (prev != nullptr && root->val <= prev->val)
{
// 不严格升序
return false;
}
// 不论如何都需要记录成上一个节点
prev = root;
if (check(root->right, prev) == false)
{
return false;
}
return true;
}
};