二叉搜索树的后序遍历序列

Posted zhangxiaoyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉搜索树的后序遍历序列相关的知识,希望对你有一定的参考价值。

 

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

 

对于一个区间[begin,end]判断是否是搜索二叉树:

①取int val=arr[end];

②i从[begin,end-1]开始遍历区间,直到找到一个大于val的元素break或者循环结束,此时的i是第一个大于val的元素或者是end,于是构建2个子数组是[begin,i-1]和[i,end-1].对这2个子数组再调用递归方法即可。

注意:上面有2个特殊情况,当begin<i-1即左子树为null,于是数组第一个元素就大于val,于是i=begin,显然begin>i-1,即begin>end或者i<end-1即右子树为null,于是当[begin,end-1]所有元素都遍历完成后都没有找到大于val的元素,于是此时i=end,于是i>end-1,即begin>end。

边界条件:递归判断一个数组[a,b]是否是搜索二叉树,终止条件就是某侧的子树为null,于是当遇到begin<i-1或者i<end-1就return结束递归即可,即边界条件是:begin>end。

 

  1. //判断一个数组是否是某搜索二叉树的后序遍历,递归,先判断再分解  
  2. public class Solution {  
  3.     public boolean VerifySquenceOfBST(int [] sequence) {  
  4.  //特殊输入:如果整棵树都是空树那么不是搜索二叉树,如果只有部分子树为空那么可以是搜索二叉树  
  5.         if(sequence.length==0) return false;  
  6.         //调用递归方法解决问题  
  7.         return this.process(sequence,0,sequence.length-1);  
  8.     }  
  9.       
  10.     //递归方法,输入一个数组和判断的区间,判断是否是一棵搜索二叉树  
  11.     private boolean process(int[] arr,int begin,int end){  
  12.         //边界条件  
  13.         if(begin>end) return true;  
  14.         //取最后一个元素作为分界值  
  15.         int val=arr[end];  
  16.         //①先判断整个数组是否符合大小关系  
  17.         int i=begin;  
  18.         for(;i<=end-1;i++){  
  19.             if(arr[i]>val) break;  
  20.         }  
  21.         for(int j=i+1;j<=end-1;j++){  
  22.             if(arr[j]<val) return false;  
  23.         }  
  24.         //此时i是2个子数组的分界点  
  25.         boolean b1=this.process(arr,begin,i-1);  
  26.         boolean b2=this.process(arr,i,end-1);  
  27.         return b1&&b2;  
  28.     }  
  29. }  

以上是关于二叉搜索树的后序遍历序列的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer对答如流系列 - 二叉搜索树的后序遍历序列

二叉搜索树的后序遍历序列-剑指Offer

二叉搜索树的后序遍历序列

LeetCode二叉搜索树的后序遍历序列

LeetCode二叉搜索树的后序遍历序列

二叉搜索树的后序遍历序列——24