/*
* 题目:二叉搜索树的后序遍历序列
* 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
* 如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
*
* 思路:
* 二叉搜索树:根节点大于所有左孩子,小于所有右孩子。后序遍历:左右根
* 假设后续遍历序列:2, 5, 4, 3, 7, 9, 8, 6
* 则根节点为6,此序列可被分为两部分:
* 第一部分全部小于根节点:2,5,4,3
* 第二部分全部大于根节点:9,8
* 此时第一部分和第二部分分别为一颗二叉搜索树,继续递归判断
*/
public boolean verifySquenceOfBST(int[] sequence)
{
if(sequence.length == 0){
return false;
}
int end = sequence.length - 1;
return isSquenceOfBST(sequence, 0, end);
}
public boolean isSquenceOfBST(int[] sequence, int start, int end){
//start大于end说明为空树,start等于end是只有一个结点
if(start >= end){
return true;
}
//根结点
int rootData = sequence[end];
//左右子树分隔点(position属于右子树)--- 已确保position左侧结点都小于根结点
int position = findPosition(sequence, rootData, start, end - 1);
//检查position右侧结点是否都大于根结点
for (int i = position; i < end; i++){
if(sequence[i] < rootData){
return false;
}
}
//递归判断左右子树
return isSquenceOfBST(sequence, start, position - 1) && isSquenceOfBST(sequence, position, end - 1);
}
public int findPosition(int[] sequence, int rootData,int start, int end){
int i = start;
for (; i <= end; i++){
if(sequence[i] > rootData){
break;
}
}
return i;
}
public static void main(String[] args)
{
VerifySquenceOfBST vs = new VerifySquenceOfBST();
int[] array = {2, 5, 4, 3, 7, 9, 8, 6};
System.out.println(vs.verifySquenceOfBST(array));
}
二叉搜索树的后序遍历序列
最新推荐文章于 2023-03-19 11:29:26 发布