注意二叉搜索树的特性:
- 节点的左子树只包含小于当前节点的数
- 节点的右子树只包含大于当前节点的数
- 所有左子树和右子树自身必须也是二叉搜索树
注意本道题有陷阱(头次做题的思想误区):
- 不能单纯比较左节点小于中间节点,右节点大于中间节点,因为左子树的值要全部小于中间节点,右子树全部大于中间节点
本题的正确解题思路如下:
使用中序遍历,因为遍历顺序为左中右,二叉搜索树在中序遍历情况下为递增序列,所以验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。可以递归中序遍历将二叉搜索树转变成一个数组,然后只要比较一下,这个数组是否是有序的,注意二叉搜索树中不能有重复元素。
递归法代码如下:
class Solution {
private:
vector<int> vec;
void traversal(TreeNode* root) {
if (root == NULL) return;
traversal(root->left);
vec.push_back(root->val); // 将二叉搜索树转换为有序数组
traversal(root->right);
}
public:
bool isValidBST(TreeNode* root) {
vec.clear(); // 不加这句在leetcode上也可以过,但最好加上
traversal(root);
for (int i = 1; i < vec.size(); i++) {
// 注意要小于等于,搜索树里不能有相同元素
if (vec[i] <= vec[i - 1]) return false;
}
return true;
}
};