
输入一个整数数组,以确定该数组是否是遍历二叉搜索树的结果. 如果是,则输出“是”序列二叉排序树,否则输出“否”. 假设输入数组中的任何两个数字互不相同.
示例:



以{5,7,6,9,11,10,8}为例,按随后顺序遍历的结果的最后一个数字8是根节点的值. 在此数组中,前三个数字5、7和6都小于8,这是值为8的节点的左子树节点. 最后三个数字9、11和10都大于8. 这就是价值. 8个节点的右子树节点.
我们接下来使用相同的方法来确定与数组每个部分相对应的子树的结构. 这实际上是一个递归过程. 对于序列5、7和6,最后一个数字6是左子树的根节点的值. 数字5小于6,它是值为6的节点的左子节点,而7是其右子节点. 同样序列二叉排序树,在序列9、11和10中,最后一个数字10是右子树的根节点. 数字9小于10,它是值为10的节点的左侧子节点,而11为右侧. 子节点.
![]()
我们使用递归方法首先确定数组左右子树的位置,然后确定左右子树是否为二叉搜索树.
2. 代码实践

C ++:
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
return bst(sequence, 0, sequence.size() - 1);
}
private:
bool bst(vector<int> seq, int begin, int end){
if(seq.empty() || begin > end){
return false;
}
//根结点
int root = seq[end];
//在二叉搜索树中左子树的结点小于根结点
int i = begin;
for(; i < end; ++i){
if(seq[i] > root){
break;
}
}
//在二叉搜索书中右子树的结点大于根结点
for(int j = i; j < end; ++j){
if(seq[j] < root){
return false;
}
}
//判断左子树是不是二叉搜索树
bool left = true;
if(i > begin){
left = bst(seq, begin, i - 1);
}
//判断右子树是不是二叉搜索树
bool right = true;
if(i < end - 1){
right = bst(seq, i , end - 1);
}
return left && right;
}
};
Python:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-211150-1.html
当时就想到了
公布双降的日期时间点