判断二叉搜索树的后序遍历序列问题
public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { if(sequence==null||sequence.length==0) return false; if(sequence.length==1) return true; return find(sequence,0,sequence.length-1); } public boolean find(int[] array,int start,int end){ if(start>=end)return true; //int root=; int i=end; while(i>start&&array[i-1]>array[end]) { i--; } for(int j=start;j<=i-1;j++){ if(array[j]>array[end]) return false; } return find(array,start,i-1)&&find(array,i,end-1); } }
后序遍历的特点就是根节点在最后,结合二叉搜索树的性质,根节点的左子树值均小于根节点,右子树值均大于根节点。所以,我们可以得到,在给定数组中,凡是小于根节点的为左子树部分,大于根节点的为右子树部分。但是如果在左子树中找到大于根节点,或在右子树中找到小于根节点的,则给定序列就不是后序遍历的结果。
这里我用递归的思想,将一个数组问题利用分治的思想,从后往前查找,直到第一次找到小于根节点的值array[i-1],这个值作为左子树的根节点,相对应的i~end-1的部分就是我们的右子树了。一层一层递归下去就是我们想要的结果。