标签:info 要求 || int 排除 二叉树 com col seq
题目:二叉搜索树的后续遍历数列
要求:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
左图的正确后序遍历序列5、7、6、9、1 1、10、8
第一:递归求解方法
1 public class Solution { 2 public boolean VerifySquenceOfBST(int [] sequence) { 3 //先来判断特殊情况,传入的数组为空或者长度为零 4 //按照定义来说,空树也是二叉树,但是牛客网的刷题系统里默认不是,所以此处返回false 5 if(sequence==null || sequence.length==0) return false; 6 return VerifySquenceOfBST(sequence,0,sequence.length-1); 7 } 8 public boolean VerifySquenceOfBST(int [] sequence,int start,int end){ 9 //不太明白.不过写的肯定是基本情况 10 if(start >= end) return true; 11 int temp= end-1; 12 while(temp >= start && sequence[temp]>sequence[end]) temp--; 13 for(int i=start;i<temp;i++){ 14 if(sequence[i]>sequence[end]) return false; 15 } 16 return VerifySquenceOfBST(sequence,start,temp) && VerifySquenceOfBST(sequence,temp+1,end-1); 17 } 18 }
bug1: 关于16行到底是返回temp+1还是temp还是temp-1,可以拿个正确的后序遍历序列在草稿纸上,画一下temp的遍历过程就能明白
bug2:16行最后,返回一定是end-1,因为end所在的位置是root啊,已经被排除了
bug3:第6行要写length-1,忘了-1
bug4:关于第10行,一定要做下解释,弄了半天才弄明白
序号 0 1 2 3 4 5 6
情况1: 5、7、6、9、1 1、10、8序列,下一步分为5,7,6左树序列 和 9,11,10右树序列
对于 0 1 2 ,temp最终为0,end为2;
5、7、6
VerifySquenceOfBST(sequence,start,temp) && VerifySquenceOfBST(sequence,temp+1,end-1);
0 0 1 1
满足 if(start >= end) return true;
情况2:对于右树序列,也同样可以这样分析
情况3:有空树的情况
后序遍历序列为 0 1 2 3
5、7、6、8
最终tem为2,end为3,start为0, 所以 VerifySquenceOfBST(sequence,start,temp) && VerifySquenceOfBST(sequence,temp+1,end-1);
0 2 3 2
满足 if(start >= end) return true;
第二:本地编译器代码
是否是BST的后序遍历 VerifySquenceOfBST
标签:info 要求 || int 排除 二叉树 com col seq
原文地址:https://www.cnblogs.com/shareidea94/p/10886694.html