您的位置:首页 > 其它

[leetcode刷题系列]Validate Binary Search Tree

2013-08-11 01:50 351 查看
- - 嗯, 按照定义来就好了

/**
* Definition for binary tree
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
bool dfs(TreeNode * root, int in, int ax){
if(root->val < in || root->val > ax)
return false;
if(root->left != 0)
if(!dfs(root->left, in, root->val - 1))
return false;
if(root->right != 0)
if(!dfs(root->right, root->val + 1, ax))
return false;
return true;
}
public:
bool isValidBST(TreeNode *root) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
return root == 0 || dfs(root, INT_MIN, INT_MAX);
}
};


====我是分割线=====

下面是9-27号写的morris版本,这个问题re了一下午,十分费解。后来我拿Recover Binary Search Tree这个题目的代码直接判断不合法对数是否大于0就可以了,然后想了下区别。发现原来是之前的代码在发现答案为否定的情况下就直接return了。
导致二叉树结构被破坏了。于是系统的代码自己跑的时候就re了,反馈出来的结果就是我的代码re了,囧。 所以用morris的情况切记一定要保证跑完之后树的结构没有被破坏。

/**
* Definition for binary tree
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isValidBST(TreeNode *root) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
bool ret = true;
int pre_val = INT_MIN;
TreeNode * cur = root;
while(cur != 0){
if(cur->left == 0){
if(cur->val <= pre_val)
ret = false;
pre_val = cur->val;
cur = cur->right;
}else{
TreeNode * pre_node = cur->left;
while(pre_node->right != 0 && pre_node->right != cur){
pre_node = pre_node->right;
}
if(pre_node->right == 0){
pre_node->right = cur;
cur = cur->left;
}else{
// visit
if(cur->val <= pre_val)
ret = false;
pre_val = cur->val;
pre_node->right = 0;
cur = cur->right;
}
}
}
return ret;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: