43.二叉樹後序遍歷的結果

題目:輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。

解析:二叉搜索樹爲二叉樹左節點小於根節點,右節點大於根節點;
①[5, 7, 6, 9, 11, 10, 8]數組中最後一位元素8爲二叉搜索樹的根節點,從後往前找到所有連續比根節點8大的數即爲根節點8的右子樹,記錄此時的位置索引index;
②如果該數組是二叉搜索樹的後序遍歷結果,則index之前的所有數組元素均比根節點8大;
③如果步驟①②中均成立,則再次比較0-(index-1)中的數組和index-(arr.length-2)中的數組是否同樣滿足二叉搜索樹的性質,只要其中有一個未能滿足就return NO。

public boolean VerifySquenceOfBST(int [] sequence) {
  if (sequence.length == 0)  return false;
  boolean ret = ispostOrder(sequence,0,sequence.length-1);
  return ret;
 }
 public boolean ispostOrder(int[] sequence,int startidx,int endidx){
  if (startidx>=endidx)  return true;
  int i = endidx;//序列的最後一個爲根節點
  //從序列的後面往前遍歷,直到找到比根節點小的位置
  while (i>startidx&&sequence[i-1]>sequence[endidx]){
   --i;
  }
  //此時i-1位置序列元素小於sequence[endidx]
  for (int k = i-1; k>=startidx; k--){
   if (sequence[k]>sequence[endidx])
    return false;
  }
  //繼續判斷根節點的左子樹和右子樹是否同樣滿足二叉搜索樹的性質
  return ispostOrder(sequence,startidx,i-1)&&ispostOrder(sequence,i,endidx-1);
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章