LeetCode98. 验证二叉搜索树
题目
代码
法一、中序遍历结果保存下来,查看是否是递增序列
1 class Solution { 2 public: 3 vector<int>res; 4 void dfs(TreeNode* root){ 5 if(root == NULL) return; 6 dfs(root->left); 7 res.push_back(root->val); 8 dfs(root->right); 9 } 10 bool isValidBST(TreeNode* root) { 11 dfs(root); 12 for(int i = 0;i < res.size()-1;i++){ 13 if(res[i] >= res[i+1]) return false; 14 } 15 return true; 16 } 17 };
法二、递归,在遍历过程中查看是否有序
1 class Solution { 2 public: 3 long long maxVal = LONG_MIN; 4 bool isValidBST(TreeNode* root) { 5 if(root == NULL) return true; 6 bool left = isValidBST(root->left); 7 if(maxVal < root->val) maxVal = root->val; 8 else return false; 9 bool right = isValidBST(root->right); 10 return left && right; 11 } 12 };
注意:
1.不能简单的比较左节点小于根节点,根节点小于右节点 就为true。BST树是根节点大于左子树的所有结点,小于右子树的所有结点。
2. 树的结点元素的值可以取到 INT_MIN,所以要用更小的值,用long long 类型,LONG_MIN,,或者通过记录上上一个结点指针
1 class Solution { 2 public: 3 TreeNode *pre = NULL; 4 bool isValidBST(TreeNode* root) { 5 if(root == NULL) return true; 6 bool left = isValidBST(root->left); 7 if(pre !=NULL && pre->val >= root->val) return false; 8 else pre = root; 9 bool right = isValidBST(root->right); 10 return left && right; 11 } 12 };