輸入一個整數數組,判斷該數組是否是某二叉搜索樹的後序遍歷的結果。若是是則輸出Yes,不然輸出No。假設輸入的數組的任意兩個數字都互不相同。編程
二叉樹的後序遍歷也就是先訪問左子樹,再訪問右子樹,最後訪問根節點,因此不難發現,所給的數組最後一個元素必定是二叉搜索樹的根節點,而若是數組是二叉搜索樹的後續遍歷的話,就必定會根據數值劃分兩部分,左邊是根節點的左子樹,剩下的部分則是根節點的右子樹。左子樹的數值均小於根節點,右子樹的數值均大於根節點。數組
例如{5,7,6,9,11,10,8},8是二叉搜索樹的根節點,{5,7,6}是左子樹,{9,11,10}是右子樹。再遞歸判斷。spa
6是根節點,5是左子樹,7是右子樹,因爲只剩一個元素了,判斷停止,同理{9,11,10}也是如此。code
但若是不是後序遍歷的序列,如{7,4,6,5}blog
5是根節點,7,4,6三個元素沒有辦法劃分出左右子樹,由於二叉搜索樹的特性咱們知道,左子樹全部元素的值都小於根節點,右子樹的值均大於根節點,不管是{7},{4,6}仍是{7,4},{6}均不符合二叉搜索樹的性質,在編程實現的過程當中,咱們能夠遍歷數組,當出現第一個大於根節點的元素時,便認爲以前的全部元素時這個根節點的左子樹,而排除最後一個元素剩下的全部元素即是右子樹,查看右子樹中的元素若是有小於根節點的元素,即可以直接判斷不是二叉搜索樹的後續遍歷,若是沒有就遞歸執行下去。遞歸
C++io
class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { if(sequence.size() == 0) return false; return helper(sequence, 0, sequence.size()); } bool helper(vector<int> &v, int index, int length){ if(length <= 1) return true; int i = 0; for(; i < length-1; ++i){ if(v[index + i] > v[index + length -1]) break; } for(int j = i; j < length-1; ++j){ if(v[index + j] < v[index + length -1]) return false; } return helper(v, index, i) && helper(v, index+i, length-i-1); } };
Javaclass
public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { if(sequence.length == 0) return false; return helper(sequence, 0, sequence.length); } public boolean helper(int [] sequence, int index, int length){ if(length <= 1) return true; //找到第一個大於根節點的元素偏移量,此元素右側序列爲右子樹(包括) int i = 0; for(; i < length - 1; ++i){ if(sequence[index + i] > sequence[index + length -1]) break; } //檢查右子樹元素是否都大於根節點 for(int j = i; j < length - 1; ++j){ if(sequence[index + j] < sequence[index + length -1]) return false; } return helper(sequence, index, i) && helper(sequence, index+i, length-i-1); } }