剑指offer——二叉树的后续遍历
题目链接:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解题思路:
1. 后序遍历序列的最后一个元素为二叉树的根节点;
2. 二叉搜索树左子树上所有的结点均小于根结点、右子树所有的结点均大于根结点。
算法步骤如下:
1. 找到根结点;
2. 遍历序列,找到第一个大于等于根结点的元素i,则i左侧为左子树、i右侧为右子树;
3.
我们已经知道i左侧所有元素均小于根结点,那么再依次遍历右侧,看是否所有元素均大于根结点;若出现小于根结点的元素,则直接返回false;若右侧全都大于根结点,则:
4. 分别递归判断左/右子序列是否为后序序列;
1 public class Solution { 2 public boolean VerifySquenceOfBST(int [] sequence) { 3 int length = sequence.length; 4 if(length==0||sequence==null) 5 return false; 6 7 return have(sequence,0,length-1); 8 } 9 10 public static boolean have(int [] sequence,int start,int end) 11 { 12 if(start>end) 13 return true;//如果遍历完数组没报错,返回true 14 int i=start; 15 for(;i<end;i++) 16 { 17 if(sequence[i]>sequence[end]) 18 break; 19 } 20 21 int j=i; 22 for(;j<end;j++) 23 { 24 if(sequence[j]<sequence[end]) 25 return false; 26 } 27 28 boolean left = true; 29 30 if(i>0) 31 { 32 left = have(sequence,start,i-1); 33 } 34 boolean right = true; 35 36 if(i<end-1) 37 { 38 right = have(sequence,i,end-1); 39 } 40 41 return (left&&right); 42 } 43 }