当前位置: 代码迷 >> 综合 >> 剑指offer【二叉搜索树的后序遍历序列】(java版)
  详细解决方案

剑指offer【二叉搜索树的后序遍历序列】(java版)

热度:29   发布时间:2023-09-19 08:38:35.0

题目描述: 
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

思路:

二叉搜索树又叫二叉排序树,它的父节点总是大于左子节点(如果左子节点不为空),总是小于右子节点(如果右子节点不为空)。且对二叉搜索树进行中序遍历,得到一个有序升序序列。

(1).基于此性质,我们可知对一个二叉搜素树进行后续遍历,则最后一个节点为根节点。

(2).根节点左边节点对应的值小于根节点,根节点右边节点对应的值大于根节点。

(3).对一个数组,若数组为某二叉搜索树的后续遍历序列,则满足数组末尾元素为二叉搜索树的根节点值。依次从小到大遍历数组,找到第一个大于末尾元素的元素,则此元素的左右两侧元素分别是根节点的左右子树对应的元素。左右子树同样满足上述规则。

(4).对一个未知数组,从下标索引为零开始,让数组中的元素与数组最后一个元素比较。依次往后遍历,直到数组中元素大于数组中最后一个元素,则认为小于此下标索引的元素为根节点的左子树,大于此下标索引的元素为根节点的右子树。

(5).把此下标索引的左和右分别看成两个数组,按照(3)的条件依次递归,直到数组中为一个元素,如果满足条件则判断为true,否则判断为false。

代码实现如下:

public class Solution {public boolean VerifySquenceOfBST(int[] sequence){//如果数组为空或者长度小于等于零则返回falseif(sequence==null||sequence.length<=0){return false;}//传入三个参数:数组序列、数组序列开始下标索引、结束下标索引。return VerifySquenceOfBST(sequence,0,sequence.length-1);}private boolean VerifySquenceOfBST(int[]sequence,int start,int end){//判断大小下标索引是否相等,如果相等则返回trueif(start>=end){return true;}//把数组中的末尾元素赋值int root = sequence[end];//把数组中的开始元素赋值int m = start;//寻找数组中第一个大于末尾元素的元素下标索引,若数组是二叉搜索树的后序遍历序列,则此元素的右 //边元素都大于末尾元素。while(sequence[m]<root){m++;}int n = m;while(n<end){//如果数组中此元素的右边存在小于末尾元素的元素,则直接返回falseif(sequence[n]<root){return false;}n++;}    //递归判断此元素的左右元素boolean left = VerifySquenceOfBST(sequence,start,m-1);boolean right = VerifySquenceOfBST(sequence,n+1,end);//返回判断结果return left&&right;}
}