题目描述:
思路:用递归的方法遍历二叉树的每一个结点,由于二叉树的左子树结点小于根节点,右子树结点都大于根节点,所以我们在遍历每一个节点的时候都应该设置一个上界和下界,如果当前遍历结点的值不在这个范围内那就return FALSE,当然在这里很多人会想当然的认为每次让传入结点的值大于其左子树结点,小于其右子树结点,如果这样想那么你就忽略了一个东西,这样的递归不能保证根节点大于其所有左子树结点,比如(5,1,6,null,null,3,7)所以在设置递归条件的时候不能简单的说像下面这样,这里的错误就是我上面所说的。
if (root==NULL) return true; else { if(root->val<=lower||root->val>=upper) return false; else return help(root->left,INT_MIN,root->val)&&help(root->right,root->val,INT_MAX); }
在这里激励大家一下吧,学习计算机也不是一朝一夕的事,可能第一次看很难看懂感觉网上看那些答案跟自己的思路好像都对不上自己好像也不接受,但是你多想一直想,你会慢慢去接受去理解,你会想明白的 。所以我希望看到这里的小伙伴都能坚持下去。
所以正确的递归思路是怎样的呢,正确操作应为每次递归的时候应该多传入两个参数,分别是当前结点所允许的值的下界和上界lower,upper。 每次递归子树的时候只要改变一个界线也就是说递归左子树还需要沿用根节点的下界值,右子树需要沿用根节点的上界值。这里可能说的大部分小伙伴看不大明白所以希望大家可以吧(5,1,6,null,null,3,7)分别代入上面的代码和下面的代码自行分析一下即可体会其中的意思
/**
* 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 helper(TreeNode* root, long long lower, long long upper) {
if (root == nullptr) {
return true;
}
if (root -> val <= lower || root -> val >= upper) {
return false;
}
return helper(root -> left, lower, root -> val) && helper(root -> right, root -> val, upper);
}
bool isValidBST(TreeNode* root) {
return helper(root, LONG_MIN, LONG_MAX);
}
};
运行结果