题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路
这道题首先要找到二叉排序树后序遍历(遍历顺序为左右根)的特点:
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉排序树。
所以由此可以想到后序遍历序列中最后一个数即为二叉排序树的根节点,所以说我们先从后遍历序列,找到比root小的第一个节点位置,则该位置左边为左子树,右边为右子树,此时从前面往后遍历到当前位置,若都比根小,则满足,然后继续向下递归。
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length==0)
return false;
// 序列只有一个数,即只有一个根节点,也满足条件
if(sequence.length==1)
return true;
// 根节点就是序列的最后一个数
return judge(sequence, 0, sequence.length-1);
}
public boolean judge(int [] a, int star, int root){
if(star>=root)
return true;
int i=root;
// 从后面向前找比根小的节点
while(i>star && a[i-1]>a[root])
i--;
// 此时从前面往后遍历到i-1 star到i-1要比根小
for(int j=star; j<i-1;j++)
if(a[j]>a[root])
return false;
// i-1为中点,分成左右两部分,继续遍历
return judge(a, star, i-1) && judge(a, i, root-1);
}
}