题目描述
知识点
BST的中序遍历性质、DFS
结果
实现
码前思考
- 我之前想的是直接使用该节点的左右结点的值小于等于或者大于来做,结果忽视了还有该节点的根结点可能会小于该节点右结点的情况。我想这也是这道题通过率低的原因吧;
- 利用BST中序遍历之后,是有序地性质,可以使用中序遍历作为载体,保存一个
pre
遍历用于比较是否有序,从而,实现验证BST;
代码实现
//树的深度优先搜索
//注意提前终止,防止超时
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
bool flag;
int pre;
int cnt;
public:
bool isValidBST(TreeNode* root) {
flag = true;
pre = INT_MIN;
cnt = 0;
if(root == NULL){
return true;
}
dfs(root);
return flag;
}
void dfs(TreeNode* root){
//首先判断是否已经得到结果了
if(flag == false || root == NULL){
return;
}else{
//遍历左右子树
dfs(root->left);
//每次遍历之后都需要重新更新一下pre
if(root->val <= pre && cnt > 0){
flag = false;
return;
}else{
cnt++;
pre = root->val;
}
dfs(root->right);
}
}
};
码后反思
- 树的问题,要仔细思考,并且多举实际例子才对!
二刷反思
解题的突破就在于这里了,就是要想到BST的中序遍历是升序的!!!