输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
二叉搜索树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
1.后续遍历我们可以知道,最右边的是根节点r。
2.通过根节点r我们可以判断左子树和右子树。
3.判断左子树中的每个值是否小于r,右子树的每个值是否大于r.
4.对左、右子树递归判断。
// 递归版
function VerifySquenceOfBST(sequence)
{
// write code here
if(sequence.length == 0) return false;
return isSquence( sequence, 0, sequence.length-1)
}
function isSquence(squence, start, end){
if(start >= end) return true;
var i = start;
while(i < end && squence[i] < squence[end]){
i++;
}
for(var j = i; j < end; j++){
if(squence[j] < squence[end]) return false;
}
return isSquence(squence,start,i - 1) && isSquence(squence,i,end - 1)
}
// 非递归版
function VerifySquenceOfBST2(sequence) {
let n = sequence.length,
i = 0;
if (!n) return false;
while (n--) {
while (sequence[i] < sequence[n]) i++;
while (sequence[i] > sequence[n]) i++;
if (i < n) return false;
i = 0;
}
return true;
}