給你一個二叉樹的根節點?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.?