题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。(ps:我们约定空树不是二叉搜素树)
示例1
输入
[4,8,6,12,16,14,10]返回值
true
思路
已知条件:后序序列最后一个值为root;二叉搜索树左子树值都比root小,右子树值都比root大。
1、确定root;
2、遍历序列(除去root结点),找到第一个大于root的位置,则该位置左边为左子树,右边为右子树;
3、遍历右子树,若发现有小于root的值,则直接返回false;
4、分别判断左子树和右子树是否仍是二叉搜索树(即递归步骤1、2、3)。
代码
function VerifySquenceOfBST(sequence) {
// write code here
if (sequence.length === 0) {
return false;
}
return check(sequence, 0, sequence.length - 1);
}
//
function check(sequence, left, right) {
if (left >= right) {
return true;
} else {
let mid = sequence[right];
let i;
//遍历序列(除去root结点),找到第一个大于root的位置,则该位置左边为左子树,右边为右子树;
for (i = left; i < right; i++)
{
if (sequence[i] > mid)
{
break;
}
}
//遍历右子树,若发现有小于root的值,则直接返回false;
for (let j = i; j < right; j++) {
if (sequence[j] <= mid) {
return false;
}
}
//分别判断左子树和右子树是否仍是二叉搜索树
return check(sequence, left, i - 1) && check(sequence, i, right - 1);
}
}
运行环境:Javascript_V8
运行时间:12ms
占用内存:5332KB