题目:
Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
- The left subtree of a node contains only nodes with keys less than the node's key.
- The right subtree of a node contains only nodes with keys greater than the node's key.
- Both the left and right subtrees must also be binary search trees.
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isValidBST(TreeNode* root) {
if(NULL == root) return true;
vector<int> inOrderTraversalSeq;
inOrderTraversal(root, inOrderTraversalSeq);
for(int i = 1; i < inOrderTraversalSeq.size(); ++i){
if(inOrderTraversalSeq[i] <= inOrderTraversalSeq[i-1]) return false;
}
return true;
}
private:
void inOrderTraversal(TreeNode* root, vector<int> &seq){
stack<TreeNode *> sta;
TreeNode *p = root;
while(p || !sta.empty()){
while(p){
sta.push(p);
p = p->left;
}
p = sta.top();
sta.pop();
seq.push_back(p->val);
p = p->right;
}
}
};
方法二:在遍历过程中判断(记录遍历的前一个节点)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode *pre = NULL;//!!!作为全局变量
bool isValidBST(TreeNode* root) {
if (NULL == root) return true;
return isValidBSTCore(root);
}
private:
bool isValidBSTCore(TreeNode* root){
if (NULL == root) return true;
if (!isValidBSTCore(root->left)) return false;//遍历左子树
if (pre && root->val <= pre->val) return false;//判断当前节点是否合法(只和遍历序列的前一个节点比较)
pre = root;//更新pre
return isValidBSTCore(root->right);//遍历右子树
}
};