二叉搜索树的后序遍历序列
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。
- //判断一个数组是否是某搜索二叉树的后序遍历,递归,先判断再分解
- public class Solution {
- public boolean VerifySquenceOfBST(int [] sequence) {
- //特殊输入:如果整棵树都是空树那么不是搜索二叉树,如果只有部分子树为空那么可以是搜索二叉树
- if(sequence.length==0) return false;
- //调用递归方法解决问题
- return this.process(sequence,0,sequence.length-1);
- }
- //递归方法,输入一个数组和判断的区间,判断是否是一棵搜索二叉树
- private boolean process(int[] arr,int begin,int end){
- //边界条件
- if(begin>end) return true;
- //取最后一个元素作为分界值
- int val=arr[end];
- //①先判断整个数组是否符合大小关系
- int i=begin;
- for(;i<=end-1;i++){
- if(arr[i]>val) break;
- }
- for(int j=i+1;j<=end-1;j++){
- if(arr[j]<val) return false;
- }
- //此时i是2个子数组的分界点
- boolean b1=this.process(arr,begin,i-1);
- boolean b2=this.process(arr,i,end-1);
- return b1&&b2;
- }
- }
以上是关于二叉搜索树的后序遍历序列的主要内容,如果未能解决你的问题,请参考以下文章