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 ...
随机推荐
- mysql memory存储引擎简单测试
Auth: jin Date: 20140423 mysql> CREATE TABLE `t4` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` ...
- c# 简单又好用的四舍五入方法
http://www.soaspx.com/dotnet/csharp/csharp_20100415_3809.html四舍五入是软件开发中经常遇到的问题,我也在不止一个项目中用到这方面的运算:关于 ...
- oracle如何查询哪个表数据量大
- Android疑难杂症之KillProcess 和System.exit 无效
以下所讲,浓缩在 https://github.com/wytings/CrashDemo 首先就这个名字来说,kill了process 或者 system.exit确实已经把APP杀掉了,特别是当你 ...
- Ping Pod不通问题定位及Ingress验证
Ping Pod网络问题不通定位记录 1.验证墙是否通 flannel默认使用8285端口作为UDP封装报文的端口,VxLan使用8472端口,下面命令验证一下确定其在8472端口 ip -d lin ...
- Mac系统使用VS Code编译Bootstrap 4
环境: macOS 10.13.6 node.js 8.11.3 sass 1.10.3 bootstrap 4.1.3 vs code 1.25.1 Bootstrap3为我们提供了在线编译工具,可 ...
- 客户端的javascript改变了asp.net webform页面控件的值,后台代码中如何获取修改后的值。
客户端的javascript改变了asp.net webform页面控件的值,后台代码中如何获取修改后的值. 无论是什么的html控件,只要加上了runat="server" ...
- IE测试CSS兼容性测试
我们知道IE6~8是现在浏览器的主流.但是由IE6开始,我们已经知道IE并不是完全执行W3C标准.我们在编程的时候往往遇到只兼容某一种浏览器. 我们以前经常使用IE Test进行IE的兼容性测试.但是 ...
- Java中常用的6种排序算法详细分解
排序算法很多地方都会用到,近期又重新看了一遍算法,并自己简单地实现了一遍,特此记录下来,为以后复习留点材料. 废话不多说,下面逐一看看经典的排序算法: 1. 选择排序 选择排序的基本思想是遍历数组的过 ...
- git使用中的一些问题
ubuntu14.04中从服务器下代码出错如下: yingc@yingc:/media/sf_yingc/work/gitcode/androidtv$ repo sync boxThe authen ...