题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路
1.二叉搜索树的特性是左子树所有节点的值均小于根节点的值,右子树所有节点的值均大于根节点的值。
2后序遍历是先遍历左子树再遍历右子树,所以根节点一定在数组最后一位上。
3.给出的数组中,前面部分的值应小于数组最后一个值,后面部分的值应大于数组最后一个值。
可以采用递归的方法实现。
代码
function VerifySquenceOfBST(sequence)
{
// write code here
if(!sequence.length){
return false;
}
return adjustSequence(sequence,0,sequence.length-1);
}
function adjustSequence(sequence,start,end){
if(start>=end){
return true;
}
var i = start;
while(i < end && sequence[i] < sequence[end]){ //每一个子部分的前面部分都应小于该部分的根节点
i++;
}
for(var j=i;j<end;j++){ //从i开始后面部分的值都应大于根节点的值
if(sequence[j]<sequence[end]){
return false;
}
}
//将该数组分为两个部分,分别判断前面部分和后面部分是否满足左子树和右子树的后序遍历结果
return adjustSequence(sequence,start,i-1) && adjustSequence(sequence,i,end-1);
}
例如:给出数组序列2436875
从索引值为0的2开始判断是否小于根节点5,直到索引值i等于3,值为6的时候跳出while循环;
此时j=i=3,依次向后判断值是否大于根节点6,若小于6则返回false;
将数组分为两个部分:243,687;分别对两个子数组进行判断是否满足情况。