1. 程式人生 > >二叉搜索樹的後序遍歷序列

二叉搜索樹的後序遍歷序列

sequence 二叉搜索樹 als pri 情況 keyword 否則 comm ofb

輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出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. private boolean process(int[] arr,int begin,int end){
  11. //邊界條件
  12. if(begin>end) return true;
  13. //取最後一個元素作為分界值
  14. int val=arr[end];
  15. //①先判斷整個數組是否符合大小關系
  16. int i=begin;
  17. for(;i<=end-1;i++){
  18. if(arr[i]>val) break;
  19. }
  20. for(int j=i+1;j<=end-1;j++){
  21. if(arr[j]<val) return false;
  22. }
  23. //此時i是2個子數組的分界點
  24. boolean b1=this.process(arr,begin,i-1);
  25. boolean b2=this.process(arr,i,end-1);
  26. return b1&&b2;
  27. }
  28. }

二叉搜索樹的後序遍歷序列