给你一个二叉树的根节点 root
,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
前序遍历
通过更新区间,当值不在区间内就返回false
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
class Solution { public: bool dfs(TreeNode* root, long start, long end){ if(root == nullptr){ return true; } if(root->val > start && root->val < end){ return dfs(root->left, start, root->val) && dfs(root->right, root->val, end); }else{ return false; } } bool isValidBST(TreeNode* root) { if(root == nullptr){ return true; } return dfs(root->left, LONG_MIN, root->val) && dfs(root->right, root->val, LONG_MAX);
} };
|
中序遍历
通过维护一个变量pre,逐步比较整个二叉树。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
class Solution { public: long long pre = LONG_MIN; bool dfs(TreeNode* root){ if(root == nullptr){ return true; } bool flag1 = dfs(root->left); bool flag2 = false; if(root->val > pre){ flag2 = true; } pre = root->val; bool flag3 = dfs(root->right); return flag1 && flag2 && flag3;
} bool isValidBST(TreeNode* root) { if(root == nullptr){ return true; } return dfs(root);
} };
|
后序遍历
先遍历,返回区间,判断节点是不是在范围内
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
class Solution { public: long long start = LONG_MAX; long long end = LONG_MIN;
pair<long long, long long> dfs(TreeNode* root){ if(root == nullptr){ return make_pair(LONG_MAX, LONG_MIN); } pair<long long, long long> left = dfs(root->left); pair<long long, long long> right = dfs(root->right); long long x = root->val; if(x <= left.second || x >= right.first){ return make_pair(LONG_MIN, LONG_MAX); } return make_pair(min(x, left.first), max(x, right.second)); }
bool isValidBST(TreeNode* root) { return dfs(root).second != LONG_MAX; } };
|