背景:LeetCode - 98. Validate Binary Search Tree
方法:
我们先要看看二叉搜索树的定义,根节点的值要大于左子树的任意节点的值,小于右子树任意节点的值,而且左右子树都是二叉搜索树。
那我们我们要获取左右子树的最大值和最小值,用左子树的最大值与右子树的最小值比较。满足大小关系,而且左右子树都是二叉搜索树这个时候这棵树就是二叉搜索树,同时,利用求出来的左右子树最大最小值和根节点的值更新出当前树的最大最小值,最后回溯。
代码:
/**
* 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 {
public:
bool isValidBST(TreeNode* root) {
if (root == NULL)
return true;
int minn, maxn;
return dfs(root, minn, maxn);
}
private:
bool dfs(TreeNode *root, int &minn, int &maxn) {
if (root == NULL)
return true;
if (root->left == NULL && root->right == NULL) {
maxn = minn = root->val;
return true;
}
bool l, r;
int min1, min2, max1, max2;
if (root->left == NULL) {
r = dfs(root->right, min2, max2);
minn = min(root->val, min2);
maxn = max(root->val, max2);
return r && root->val < min2;
}
if (root->right == NULL) {
l = dfs(root->left, min1, max1);
minn = min(root->val, min1);
maxn = max(root->val, max1);
return l && root->val > max1;
}
l = dfs(root->left, min1, max1);
r = dfs(root->right, min2, max2);
minn = min(min(min1, min2), root->val);
maxn = max(max(max1, max2), root->val);
return l && r && max1 < root->val && min2 > root->val;
}
};