验证二叉搜索树
题目解答
/**
* 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:
long long maxVal=LONG_MIN;
bool isValidBST(TreeNode* root) {
if(root==NULL) return true;
bool b1=isValidBST(root->left);
if(maxVal < root->val) maxVal=root->val;
else return false;
bool b2=isValidBST(root->right);
return b1&&b2;
}
};
解题心得
1、该题目有点坑。因为根据题目要求:
- 不能单纯的比较左节点小于中间节点,右节点大于中间节点就完事了。因为 像该图的树,就不是一颗平衡二叉树(平衡二叉树根节点左边所有的元素都要小于根节点的元素,根节点右边所有得元素都要大于根节点的元素),然后我开始就是写出了
/** * 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: bool isValidBST(TreeNode* root) { if(root==NULL || root->left==NULL && root->right==NULL) return true; else if(root->left ==NULL){ // 判断右边 if(root->val >= root->right->val) return false; } else if(root->right==NULL){ // 判断左边 if(root->val <= root->left->val) return false; }else{ if(root->val >= root->right->val || root->val <= root->left->val) return false; } bool b1=isValidBST(root->left); bool b2=isValidBST(root->right); return b1&&b2; } };
这样的代码,然后就直接错了。
-
样例中最小节点 可能是 int 的最小值,如果这样使用最小的int来比较也是不行的。
此时可以初始化比较元素为 longlong 的最小值。(数值范围问题)
2、该题目要使用中序遍历从左到右遍历二叉树,通过记录是否是递增的,如果是,那么就直接是平衡二叉树了,但是一旦发现不是递增的就直接返回 false 就行了。