文章内容是自己刷leetcode题目的一些总结。
文章内容参考公众号: 代码随想录。
喜欢的话,希望大家可以点点赞 ^ - ^
一.题目描述
二.题目分析
我们知道,二叉搜索树的中序遍历是递增序列,我们可以将二叉树的中序遍历放入数组中,然后判断数组是不是递增的,就可以判断该二叉树是不是二叉搜索树。
另一种思路:使用数组辅助是最直观的,但是不用数组,直接在遍历二叉树过程中也可以进行比较。注意我们不能简单的比较根节点大于左节点,小于右节点,应该比较的是:根节点要比左子树的所有节点值大,比右子树所有节点值小。所以我们可以使用中序遍历,找到最左下方节点值然后再与根节点进行比较,根节点与右节点比较,递归往上。
三.递归代码
1.使用数组辅助
class Solution {
private:
vector<int> n;
void trevasal(TreeNode* root) {
if(root == nullptr) return ;
//中序遍历放入数组
trevasal(root->left);
n.push_back(root->val);
trevasal(root->right);
}
public:
bool isValidBST(TreeNode* root) {
if(root == nullptr) return true;
n.clear();
trevasal(root);
for(int i = 1; i < n.size(); i ++) { //利用二叉搜索树中序遍历是递增的性质
if(n[i - 1] >= n[i]) return false;
}
return true;
}
};
2.不使用数组
class Solution {
public:
TreeNode* pre = nullptr; //用来记录前一个结点
bool isValidBST(TreeNode* root) {
//不使用数组(二叉搜索树的中序遍历是递增序列)直接使用递归
//终止条件
if(root == nullptr) return true;
//中序遍历
bool left = isValidBST(root->left);
if(pre != nullptr && pre->val >= root->val) return false;
pre = root;
bool right = isValidBST(root->right);
return left && right;
}
};
四.总结
注意二叉搜索树的定义:节点的值大于左子树的各个节点的值,小于右子树的各个节点的值。
不使用数组辅助的话,就要在二叉树的遍历过程中进行节点处理,会用到cur与pre两个指针来记录进行比较,这种方法也很常见。