版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangvalue/article/details/87905372
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。假设输入的数组的任意两个数字都互不相同。
补充:
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的节点
思路:
采用分治法的思想,找到根结点、左子树的序列、右子树的序列,分别判断左右子序列是否为二叉树的后序序列。
由题意可得:
1. 后序遍历序列的最后一个元素为二叉树的根节点;
2. 二叉搜索树左子树上所有的结点均小于根结点、右子树所有的结点均大于根结点。
算法步骤如下:
1. 找到根结点;
2. 遍历序列,找到第一个大于等于根结点的元素i,则i左侧为左子树、i右侧为右子树;
3. 我们已经知道i左侧所有元素均小于根结点,那么再依次遍历右侧,看是否所有元素均大于根结点;若出现小于根结点的元素,则直接返回false;若右侧全都大于根结点,则:
4. 分别递归判断左/右子序列是否为后序序列;
其中在判断start<=end的时候是都需要判断
1️⃣取到start==end时说明剩下的元素为1个,肯定是符合后序遍历,就直接返回true
2️⃣须判断start>end的情况,这种情况是没有左子树,只有根节点和一个右节点(只有两个元素)的情况,此时再递归左子树的时候,此时传入的end=start-1,此时的因为之前已经判断了右子树符合条件,此时就直接返回true
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
//首先判断是否为空
if(sequence.length==0){return false;}
//当为只有一个元素的时候直接返回true
//if(sequence.length==1){return true;}
return VerifySquenceOfBST(sequence,0,sequence.length-1);
}
public boolean VerifySquenceOfBST(int [] sequence,int start,int end ) {
//取到start==end时说明剩下的元素为1个,肯定是符合后序遍历
//可是必须判断start>end的情况,这种情况是没有左子树的情况,
//在递归左子树的时候,此时传入的end=start-1
if(start>=end){return true;}
//取到end处的元素,该元素为根节点
int root= sequence[end];
int i=0;
//从左向右开始找到第一个比根节点的元素大的位置i,在i的左边即为根节点的左子树(因为题目中给成输入数组互不相同)
while(sequence[i]<root&&i<end){
i++;
}
//此时再判断在i的右边是不是都比root大,若不符合直接返回false,另从j开始
int j=i;
while(j<end){
if(sequence[j]<root){
return false;
}
j++;
}
//递归左子树
boolean left =VerifySquenceOfBST(sequence,start,i-1);
//递归右子树
boolean right =VerifySquenceOfBST(sequence,i,end-1);
return left&right;
}
}