Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
- The left subtree of a node contains only nodes with keys less than the node’s key.
- The right subtree of a node contains only nodes with keys greater than the node’s key.
- Both the left and right subtrees must also be binary search trees.
Example 1:
2
/ \
1 3
Input: [2,1,3]
Output: true
Example 2:
5
/ \
1 4
/ \
3 6
Input: [5,1,4,null,null,3,6]
Output: false
Explanation: The root node's value is 5 but its right child's value is 4.
题意
判断一棵二叉树是不是二叉搜索树
思路1
- 中序遍历二叉树,记录遍历结果
- 看中序遍历序列是否是递增的
- 注意还需要去重
res.erase(unique(res.begin(), res.end()),res.end());
代码1
/**
* 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) {
vector<int> ans;
inorder(root, ans);
vector<int> res(ans);
sort(res.begin(), res.end());
// 去重
res.erase(unique(res.begin(), res.end()),res.end());
return res == ans;
}
void inorder(TreeNode *node, vector<int> &ans){
if(node == NULL) return;
inorder(node->left, ans);
ans.push_back(node->val);
inorder(node->right, ans);
}
};
思路2
在上面做法的基础上不需要排序,只需要检查前一个元素是不是大于等于后面的元素即可,若满足,则不是一颗二叉搜索树,直接退出即可。
代码2
/**
* 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;
vector<int> ans;
inorder(root, ans);
bool flag = true;
for(int i = 0; i < ans.size() - 1; i++)
if(ans[i] >= ans[i+1])
{
flag = false;
break;
}
return flag;
}
void inorder(TreeNode *node, vector<int> &ans){
if(node == NULL) return;
inorder(node->left, ans);
ans.push_back(node->val);
inorder(node->right, ans);
}
};