[Leetcode]Verify Preorder Sequence in Binary Search Tree
2015-09-18 16:53
459 查看
Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary search tree.
You may assume each number in the sequence is unique.
Follow up:
Could you do it using only constant space complexity?
void partion(vector<int>&preorder,int start,int end,int &right){
int root = preorder[start];
for(int i = start + 1;i < end;i++){
if(preorder[i] > root){
right = i;
break;
}
}
}
//[start,end)
bool verifyPreorderSub(vector<int>&preorder,int start,int end){
if((end-start) < 2)return true;
int root = preorder[start];
//divide array into two parts
int left = start + 1,right = end;
partion(preorder,start,end,right);
//check BST property
for(int i = left;i < right;i++){
if(preorder[i] > root)return false;
}
for(int i = right;i < end;i++){
if(preorder[i] < root)return false;
}
return verifyPreorderSub(preorder,left,right)&&verifyPreorderSub(preorder,right,end);
}
/*algorithm brute force
1)A[0] is root, divide A[1..n] into two parts A[1,right-1] and A[right,n]
2)check each element A[i] in left tree A[i] < root and each element A[j] in right tree, A[j] > root
3)recrusive call preorder for child array A[1..,right-1] and A[right,n]
time O(n*n) space O(1)
*/
bool verifyPreorder(vector<int>&preorder) {
return verifyPreorderSub(preorder,0,preorder.size());
}
You may assume each number in the sequence is unique.
Follow up:
Could you do it using only constant space complexity?
void partion(vector<int>&preorder,int start,int end,int &right){
int root = preorder[start];
for(int i = start + 1;i < end;i++){
if(preorder[i] > root){
right = i;
break;
}
}
}
//[start,end)
bool verifyPreorderSub(vector<int>&preorder,int start,int end){
if((end-start) < 2)return true;
int root = preorder[start];
//divide array into two parts
int left = start + 1,right = end;
partion(preorder,start,end,right);
//check BST property
for(int i = left;i < right;i++){
if(preorder[i] > root)return false;
}
for(int i = right;i < end;i++){
if(preorder[i] < root)return false;
}
return verifyPreorderSub(preorder,left,right)&&verifyPreorderSub(preorder,right,end);
}
/*algorithm brute force
1)A[0] is root, divide A[1..n] into two parts A[1,right-1] and A[right,n]
2)check each element A[i] in left tree A[i] < root and each element A[j] in right tree, A[j] > root
3)recrusive call preorder for child array A[1..,right-1] and A[right,n]
time O(n*n) space O(1)
*/
bool verifyPreorder(vector<int>&preorder) {
return verifyPreorderSub(preorder,0,preorder.size());
}
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例