方法一:递归
二叉搜索树的中序遍历一定是升序数组,所以可以利用递归遍历二叉树,如果前一个结点一定小于当前的结点,则可以判断二叉树为二叉搜索树;否则判断为非二叉搜索树。
时间复杂度: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; } };