1. 题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。

输入:
[4,8,6,12,16,14,10]
返回值:
true

2.思路

  • 此题主要为搜索二叉树的后序遍历,首先搜索二叉树的左子树一定小于根节点,右子树一定大于根节点。
  • 其次,后序遍历主要为先遍历左叶子节点=>右叶子节点=>根节点!!!
  • 如此一来,正常的后序遍历顺序为:最后一个数为根节点(array[length-1]=root),数组的前半部分为左子树,后半部分为右子树(扣除root),所以关键在于找出前后两部分的分界线,那么就是value>root的那个位置了!
    方法:采用递归,当然有大牛更新奇的操作,不过实在看的头大,这里就不复现了。
    时间复杂度:递归方法在每一层的遍历开销是O(n),而对于二叉树而言,递归的层数平均是O(logn),因此,递归方法的最终复杂度是O(nlogn)
    代码如下:
    public class Solution {
      public boolean VerifySquenceOfBST(int [] sequence) {
          //判空
          if(sequence.length==0){
              return false;
          }
          return judge(sequence,0,sequence.length-1);
      }
      //判断函数
      public boolean judge(int[] arr,int start,int end){
          //如果首尾相等,则说明已经遍历完了,且满足条件
          if(start>=end){
              return true;
          }
          //!!!!!此处刚开始赋值start不行,经过编译调整为end通过,求有缘人评论解答!!!谢谢
          int flag=end;
          //找到树中第一个大于根节点的位置并给flag
          for(int i=start;i<end;i++){
              if(arr[i]>arr[end]){
                    flag=i;
                    break;
              }
          }
          //遍历后面的,如果存在小于根节点的就返回false
          for(int j=flag;j<end;j++){
              if(arr[j]<arr[end]){
                  return false;
              }
          }
          //递归,将左右子树再进行判断
          return judge(arr,start,flag-1)&&judge(arr,flag,end-1);
      }
    }
    

```