题目链接
题目描述
思路:二叉搜索树是一种经过排序的二叉树。有这样的性质,左子节点的值<根节点的值<右子节点的值。 有递归和非递归解法。 递归较容易写,非递归来自讨论区。
非递归思路:因为有以上的性质,所以可以每次针对根节点,判断左右子树是否为二叉搜索树,满足就删掉根节点;否则不是二叉搜索树。
代码【递归】:
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.empty()) {
return false;
}
int len=sequence.size();
///在二叉搜索树中查找小于根节点的左子节点
vector<int>leftSequence;
int i=0;
while(i<len-1) {
if(sequence[i]<sequence[len-1]) {
leftSequence.push_back(sequence[i]);
} else {
break;
}
i++;
}
///在二叉搜索树中查找大于根节点的右子节点
vector<int>rightSequence;
int j=i;
while(j<len-1) {
if(sequence[j]>sequence[len-1]) {
rightSequence.push_back(sequence[j]);
} else {
return false;
}
j++;
}
/// 判断左子树是否为二叉搜索树
bool left=true;
if(i>0) {
left = VerifySquenceOfBST(leftSequence);
}
///判断右子树是否为二叉搜索树
bool right=true;
if(i<len-1) {
right = VerifySquenceOfBST(rightSequence);
}
return left&&right;
}
};
代码【非递归】:
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.empty()) {
return false;
}
int len=sequence.size()-1;
for(int i=0; len; i=0,len--) {
while(sequence[i++] < sequence[len]);
while(sequence[i++] > sequence[len]);
if(i < len)
return false;
}
return true;
}
};