輸入一個整數數組,判斷該數組是否是某二叉搜索樹的後序遍歷的結果。若是是則輸出Yes,不然輸出No。假設輸入的數組的任意兩個數字都互不相同。數組
後序遍歷的結果,根節點在最後一個,前面的部分,前一部分是右子樹,應該都小於根節點,後一部分是左子樹,都大於根節點。blog
所以遞歸處理就能夠了遞歸
public: bool VerifySquenceOfBST(vector<int> sequence) { return aux(sequence, 0, sequence.size() - 1); } bool aux(vector<int> sequence, int begin, int end) { if (sequence.empty() || begin > end) { return false; } int root = sequence[end]; int i = begin; // 找到右子樹的第一個節點 for (; i < end; ++i) { if (sequence[i] > root) //i座標爲右子樹第一個節點 break; } // 判斷右子樹是否符合要求 for (int j = i; j < end; ++j) { if (sequence[j] < root) return false; } // 遞歸判斷左右子樹 bool left = true; if (i > begin) { left = aux(sequence, begin, i - 1); } bool right = true; if (i < end - 1) { right = aux(sequence, i, end - 1); } return left && right; }
或是更改一下判斷順序class
bool VerifySquenceOfBST(vector<int> sequence) { return aux(sequence, 0, sequence.size() - 1); } bool aux(vector<int> sequence, int begin, int end) { if (sequence.empty()) { return false; } if (begin >= end) { return true; } int root = sequence[end]; int i = begin; for (; i < end; ++i) { if (sequence[i] > root) //i座標爲右子樹第一個節點 break; } for (int j = i; j < end; ++j) { if (sequence[j] < root) return false; } bool left = true; left = aux(sequence, begin, i - 1); bool right = true; right = aux(sequence, i, end - 1); return left && right; }