给你一个二叉树的根节点 root
,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
提示:
- 树中节点数目范围在
[1, 104]
内 -231 <= Node.val <= 231 - 1
答案&测试代码:
void testLeeCode98() { // 验证二叉搜索树
/**
* Definition for a binary tree node.
*/
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution {
public:
bool isValidBST(TreeNode* root) {
vector<int> vec;
getOrder(root, vec); // 如果是由小到大的顺序,则为二叉搜索树
for (auto it = vec.begin() + 1; it != vec.end(); ++it) {
if (*it <= *(it - 1)) { // 当前元素 <= 前一个元素。 迭代器解引用得到元素值,有点像指针
return false;
}
}
return true;
}
private:
void getOrder(TreeNode* node, vector<int>& vec) {
if (node) {
getOrder(node->left, vec);
vec.push_back(node->val);
getOrder(node->right, vec);
}
}
};
// 测试代码:
TreeNode node2(2), node1(1), node3(3);
node2.left = &node1;
node2.right = &node3;
Solution solution;
std::cout << "isValidBST? " << solution.isValidBST(&node2) << endl;
}
打印:
ok,提交到LeeCode:
ok.