您的位置:首页 > 其它

[leetcode][tree] Validate Binary Search Tree

2015-05-20 19:01 253 查看
题目:

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.

利用二叉搜索树的特点:中序遍历序列是递增序列(O(n))

/**
* 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);//遍历右子树
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: