IT公司100題-9-判斷整數序列是否是二元查找樹的後序遍歷結果

問題描述:java

輸入一個整數數組,判斷該數組是否是某二元查找樹的後序遍歷的結果。數組

若是是返回true,不然返回false。post

例如輸入4, 8, 6, 12, 16, 14, 10,因爲這一整數序列是以下樹的後序遍歷結果:spa

 10
/     \
6      14
/  \    /   \
4   8 12    16code

所以返回true。遞歸

若是輸入6, 5, 8, 5, 7 ,則返回false。io

 問題分析:class

在後續遍歷獲得的序列中,最後一個元素爲樹的根結點。根節點元素將數組分爲兩部分,左邊都小於根節點,右邊都大於根節點。遞歸的確認左右是不是二元查找樹便可。import

代碼實現:date

/**
 * @project: oschina
 * @filename: IT9.java
 * @version: 0.10
 * @author: JM Han
 * @date: 8:40 2015/11/5
 * @comment: Test Purpose
 * @result:
 */

import static tool.util.*;

public class IT9 {
   static boolean verify(int start, int end, int[] a){
      //只有一個元素時 = ,返回true
      //左子樹不存在是 > , 返回true
      if(start >= end)
         return true;

      int i; int j;
      for(i = start; a[i] < a[end]; i++);
      for(j = i; a[j] > a[end]; j++);

      //左子樹和右子樹加上root能夠遍歷完此部分數組,不然不是BST
      if(j != end)
         return false;

      boolean right = verify(start, i-1, a);
      boolean left = verify(i, j - 1, a);

      //進當左右子樹都符合條件返回true
      if(right && left)
         return true;

      return false;
   }

   public static void main(String[] args) {
      //int[] a = new int[]{4,8,6,12,16,14,10};
      //int[] a = new int[]{4,8,6,12,16,11,10};
      //int[] a = new int[]{4,8,6,9,11,12,10};
      //int[] a = new int[]{4,8,6,12,9,11,10};
      boolean res = verify(0, a.length-1, a);
      String isn = res?"is":"isn't";
      System.out.println("Array " + isn + " a tree of postorder tranversal");
   }
}
相關文章
相關標籤/搜索