LeetCode 98.验证二叉搜索树
思路
递归法1
充分利用二叉搜索树的有序性,采用中序遍历将遍历到的节点值放入数组中,即可得到一个递增的数组,通过判断该数组是否呈现递增趋势,进而得知该二叉树是否为二叉搜索树。
需要注意的是,二叉搜索树中的元素不能有重复。
代码
class Solution {
public:
vector<int> vec;
void traversal(TreeNode *node) {
if(node == NULL) return;
traversal(node->left);
vec.push_back(node->val);
traversal(node->right);
}
bool isValidBST(TreeNode* root) {
vec.clear();
traversal(root);
for(int i = 1; i < vec.size(); i++) {
if(vec[i] <= vec[i - 1]) return false;
}
return true;
}
};
递归法2
需要注意,二叉搜索树并不是单纯的左节点小于中间节点,右节点大于中间节点,而是需要比较左子树所有节点都小于中间节点,右子树所有节点都大于中间节点
class Solution {
public:
long long maxVal = LONG_MIN;
bool isValidBST(TreeNode* root) {
if(root == NULL) return true;
bool left = isValidBST(root->left);
if(maxVal < root->val) maxVal = root->val;
else return false;
bool right = isValidBST(root->right);
return left && right;
}
};
迭代法
利用中序遍历,通过创建一个保存前一个节点的指针,进而每次遍历到中间节点时,判断该中间节点是否小于当前节点,若小于则说明该二叉树不是二叉搜索树。
class Solution {
public:
long long maxVal = LONG_MIN;
bool isValidBST(TreeNode* root) {
stack<TreeNode *>st;
TreeNode *cur = root;
TreeNode *pre = NULL;
while(cur != NULL || !st.empty()) {
if(cur) {
st.push(cur);
cur = cur->left;
} else {
cur = st.top();
st.pop();
if(pre != NULL && cur->val <= pre->val) {
return false;
}
pre = cur;
cur = cur->right;
}
}
return true;
}
};