方法一:递归
二叉搜索树的中序遍历一定是升序数组,所以可以利用递归遍历二叉树,如果前一个结点一定小于当前的结点,则可以判断二叉树为二叉搜索树;否则判断为非二叉搜索树。
时间复杂度:o(n)。
空间复杂度:o(n)。
class Solution {
public:
//初始化前结点值为最小值
long pre = INT_MIN;
bool isValidBST(TreeNode* root) {
if (root == nullptr)
return true;
//遍历左结点
if (!isValidBST(root->left))
return false;
//判断前结点与当前结点的大小
if (root->val <= pre)
return false;
pre = root->val;
if (!isValidBST(root->right))
return false;
return true;
}
};
方法二:栈(非递归)
原理与方法一相同,不同的是使用辅助栈来得到二叉树的中序遍历,对中序遍历进行是否升序的判断。
时间复杂度:o(n)。
空间复杂度:o(n)。辅助栈和辅助数组所需空间为o(n),因为辅助栈减少一个结点,辅助数组才写入一个结点。
class Solution {
public:
bool isValidBST(TreeNode* root) {
if (root == nullptr)
return true;
stack<TreeNode*> temp;
vector<int> in_order;
//中序遍历
while (!temp.empty() || root != nullptr) {
while (root != nullptr) {
temp.push(root);
root = root->left;
}
TreeNode* node = temp.top();
temp.pop();
in_order.push_back(node->val);
root = node->right;
}
//判断是否为升序
for (int i = 1; i < in_order.size(); i++) {
if (in_order[i] <= in_order[i - 1])
return false;
}
return true;
}
};

京公网安备 11010502036488号