剑指offer_【23】二叉搜索树的后序遍历序列

1.题目描述

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

2.解题思路

二叉搜索树后序遍历为:左子树—->右子树—->根,且左子树值<根值<右子树值

如二叉搜索树:

           10

        /       \

    6              12

 /    \           /   \

3      7        11     20

后序遍历结果为:3 7 6 11 20 12 10

对于一个数组sequence,最后一个元素是sequence[len-1] (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于sequence[len-1] ,后一段(右子树)大于sequence[len-1] ,且这两段(子树)都是合法的后序序列

3.代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.util.*;
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence==null||sequence.length<=0)
{
return false;
}
int len=sequence.length; //数组长度
int root=sequence[len-1]; //数组的最后一个数为根
int i=0;
for(;i<len-1;i++)
{
if(root<=sequence[i]) //左子树的数值都小于根
break;
}
//此时的j即为划分出来的左子树部分和右子树部分的分界
int j=i;
for(;j<=len-1;j++)
{
//j到len-1都都为右子树,数值都大于root,如果root大于他们,则返回false
if(root>sequence[j])
{
return false;
}
}
//递归判断左子树
boolean leftflag=true;
if(i>0)
{
leftflag=VerifySquenceOfBST(Arrays.copyOfRange(sequence,0,i));

}
//递归判断右子树
boolean rightflag=true;
if (i<len-1) {
rightflag=VerifySquenceOfBST(Arrays.copyOfRange(sequence,i,sequence.length-1));

}
return leftflag && rightflag;
}
}
文章目录
  1. 1. 1.题目描述
  2. 2. 2.解题思路
  3. 3. 3.代码
| 139.6k