Lintcode---验证二叉查找树
给定一个二叉树,判断它是否是合法的二叉查找树(BST)
一棵BST定义为:
- 节点的左子树中的值要严格小于该节点的值。
- 节点的右子树中的值要严格大于该节点的值。
- 左右子树也必须是二叉查找树。
- 一个节点的树也是二叉查找树。
一个例子:
2
/ \
1 4
/ \
3 5
上述这棵二叉树序列化为 {2,1,4,#,#,3,5}
.
思路:
最初解法(错误解法):
使用递归的方式,按照二叉搜索树的定义去判断。考虑各种情况,然后递归。但是这种方法,一开始有漏洞,只能通过87%。
发现问题所在:像是{10,5,15,#,#,6,20}这种实例不能通过,经过考虑,确实存在问题。
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: The root of binary tree.
* @return: True if the binary tree is BST, or false
*/ /*
思路:使用递归的方式,按照二叉搜索树的定义去判断。考虑各种情况,然后递归。
但是这种方法,一开始有漏洞,只能通过87%。
发现问题所在:像是{10,5,15,#,#,6,20}这种实例不能通过,经过考虑,确实存在问题。 */
bool isValidBST(TreeNode *root) {
// write your code here if(root==NULL){
return true;
} if(root->left==NULL&&root->right==NULL){
return true;
} if(root->left!=NULL&&root->right==NULL){
if(root->left->val<root->val){
return isValidBST(root->left);
}
else{
return false;
}
} if(root->right!=NULL&&root->left==NULL){
if(root->right->val>root->val){
return isValidBST(root->right);
}
else{
return false;
}
} if(root->left!=NULL&&root->right!=NULL){
if(root->val<root->right->val&&root->val>root->left->val){
return isValidBST(root->left)&&isValidBST(root->right);
}
else{
return false;
}
}
}
};
解决方法1:借助辅助空间,因为中序遍历一定是有序的。
/
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode left, right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/
* @param root: The root of binary tree.
* @return: True if the binary tree is BST, or false
*/ /*
解决方法1:借助辅助空间,因为中序遍历一定是有序的。
*/
void help(vector<int> &vec,TreeNode *root){
//使用中序遍历,将元素压入容器;
if(root==NULL)
return ;
help(vec,root->left);
vec.push_back(root->val);
help(vec,root->right);
}
bool isValidBST(TreeNode *root) {
if(root==NULL)
return true;
vector<int> vec;
help(vec,root); int last=vec[0];
vec.erase(vec.begin());
for(auto e:vec){
if(last>=e)
return false;
last=e;
}
return true;
}
解决方法2:prev指针记录前一个节点,省下了辅助空间,而且要注意prev传进去还应该是引用。方法很好!
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: The root of binary tree.
* @return: True if the binary tree is BST, or false
*/ /* 解决方法2:prev指针记录前一个节点,省下了辅助空间,而且要注意prev传进去还应该是引用。 */ bool isValidBST(TreeNode* root)
{
TreeNode *pre = NULL;
return validate(root, pre);
} bool validate(TreeNode *root, TreeNode *&pre)
{
if (root == NULL)
return true;
if (!validate(root->left, pre))
return false;
if (pre != NULL && pre->val >= root->val)// 如果当前还是NULL那就先不管吧,继续往下运行。
return false;
pre = root;
return validate(root->right, pre);
}
};
Lintcode---验证二叉查找树的更多相关文章
- Java for LintCode 验证二叉查找树
给定一个二叉树,判断它是否是合法的二叉查找树(BST) 一棵BST定义为: 节点的左子树中的值要严格小于该节点的值. 节点的右子树中的值要严格大于该节点的值. 左右子树也必须是二叉查找树. ...
- 验证二叉查找树(LintCode)
验证二叉查找树 给定一个二叉树,判断它是否是合法的二叉查找树(BST) 一棵BST定义为: 节点的左子树中的值要严格小于该节点的值. 节点的右子树中的值要严格大于该节点的值. 左右子树也必须是二叉查找 ...
- lintcode:验证二叉查找树
题目 给定一个二叉树,判断它是否是合法的二叉查找树(BST) 一棵BST定义为: 节点的左子树中的值要严格小于该节点的值. 节点的右子树中的值要严格大于该节点的值. 左右子树也必须是二叉查找树. 一个 ...
- LintCode 11 二叉查找树的搜索区间
题目链接:http://www.lintcode.com/zh-cn/problem/search-range-in-binary-search-tree/ 1.描述 给定两个值 k1 和 k2(k1 ...
- lintcode:在二叉查找树中插入节点
题目: 在二叉查找树中插入节点 给定一棵二叉查找树和一个新的树节点,将节点插入到树中. 你需要保证该树仍然是一棵二叉查找树. 样例 给出如下一棵二叉查找树,在插入节点6之后这棵二叉查找树可以是这样 ...
- 验证二叉查找树 · Validate Binary Search Tree
[抄题]: [思维问题]: 不知道要定义resultType, 其实用仔细分析判断条件就行了:是否是bst+最大最小值 类似于平衡二叉树:是否平衡+左右的高度差 [一句话思路]: [输入量]:空: 正 ...
- (lintcode全部题目解答之)九章算法之算法班题目全解(附容易犯的错误)
--------------------------------------------------------------- 本文使用方法:所有题目,只需要把标题输入lintcode就能找到.主要是 ...
- CSDN总结的面试中的十大算法
1.String/Array/Matrix 在Java中,String是一个包含char数组和其它字段.方法的类.如果没有IDE自动完成代码,下面这个方法大家应该记住: toCharArray() / ...
- 算法——dfs 判断是否为BST
95. 验证二叉查找树 中文English 给定一个二叉树,判断它是否是合法的二叉查找树(BST) 一棵BST定义为: 节点的左子树中的值要严格小于该节点的值. 节点的右子树中的值要严格大于该节点的值 ...
- Lintcode 85. 在二叉查找树中插入节点
-------------------------------------------- AC代码: /** * Definition of TreeNode: * public class Tree ...
随机推荐
- BUG:php7.1 访问yii数据库 自动加端口3306 报错
跟新完php7.1后访问yii项目出现下图错误 可见数据库链接是已经制指定了端口号9004 但是访问时后续自动加上了3306 原因:换了方式 //这种方式只支持5.6版本php 'db' => ...
- Codeforces Round #342 (Div. 2) E. Frog Fights set 模拟
E. Frog Fights 题目连接: http://www.codeforces.com/contest/625/problem/E Description stap Bender recentl ...
- Ajax同步异步的区别
1,什么是Ajax Ajax: asynchronous javascript and xml (异步javascript和xml) 其是可以与服务器进行(异步/同步)交互的技术之一. Aja ...
- 监控RTSP 流
rtsp://admin:admin12345@192.168.0.100/live1.sdp
- ENVI裁剪
一.basic tools-->resize data进行规则裁剪 虽然是进行图像重采样工具,但也可以用于简单快速的裁剪 1. 选中要裁剪的图像: 对话框下面选择spatial subset(构 ...
- spring的@Async异步使用
pring的@Async功能,用的时候一定要注意: 1.异步方法和调用类不要在同一个类中. 2.xml里需要加入这一行 <task:annotation-driven/> 下面的可以直接粘 ...
- 动态改变Android控件大小
Button button = (Button) findViewById(R.id.button2);button.setOnClickListener(myOnClickListener); // ...
- python的globals()使用
使用命令pyrasite-shell pid,可以与进程进行shell交互,获取,在shell里执行globals(),可以获取整个进程的全部全局变量,比如django应用.flask应用的变量,而不 ...
- entity framework 去缓存
MSDN上对MergeOption枚举的定义为: 成员名称 说明 AppendOnly 不会从数据源加载对象上下文中已存在的对象.这是查询或调用 EntityCollection<(Of < ...
- SQL Server 更新 触发器
- 复制代码 代码如下: create trigger TR_MasterTable_Update on MasterTable after update as if update ([Type])- ...