
这道题之前也刷过,自己做了一遍,发现卡在了第70多个样例,才发现自己没有利用二叉搜索树的性质,但凡涉及到二叉搜索树,应该首先考虑中序遍历!!!
被卡住的测试样例是这样的:
虽然每个左子树和右子树都是二叉搜索树,但是没有满足右子树中所有元素都大于根节点元素这一性质,所以还需要进一步考虑:如何才能保证左子树的所有元素都小于当前根节点,右子树的所有元素都大于根节点?
我们需要引入一个额外的全局变量,用一个指针pre
指向当前根节点的上一个遍历节点(也就是其左子树的最右下角的节点),将中序遍历的结果放到一维数组中,该指针指向的实际上就是当前节点元素的前一个元素。我们需要判断root
的值和pre
的值谁更大,如果pre -> val >= root -> val
,就说明排列出现了问题,不满足二叉搜索树的性质,直接返回false,否则将当前节点root
赋值给pre
。
cpp
/**
* Definition for a binary tree node.
* 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:
TreeNode* pre = nullptr;
bool isValidBST(TreeNode* root) {
//涉及二叉搜索树要用中序遍历!!!
if(!root) return true; //递归终止条件
//单层递归逻辑
//左
bool left_flag = isValidBST(root -> left);
//中
if(pre && pre -> val >= root -> val)
return false;
pre = root;
//右
bool right_flag = isValidBST(root -> right);
return left_flag && right_flag;
}
};