bool isPostorder(const vector<int> &v, int l , int r){ if( l==r || l+1 == r) return true; int root = v[r], i=l, mid; while(i<r && v[i]<root) i++; mid = i; while(i < r && v[i] > root) i++; if(i != r) return false; if(mid == r || mid == l) return isPostorder(v, l ,r-1); else return (isPostorder(v, l, mid-1) && (isPostorder(v, mid, r-1)) ); }
// ====================²âÊÔ´úÂë==================== void Test(char* testName, int sequence[], int length, bool expected) { if(testName != NULL) printf("%s begins: ", testName); if(isPostorder(sequence, length) == expected) printf("passed.\n"); else printf("failed.\n"); }
bool isPostorder(int* array, int length) { if(array == NULL || length <= 0) { return false; } int root = array[length-1]; int i = 0; for(; i < length - 1; i++) { if(array[i] > root) { break; } } int j = i; for(; j < length - 1; j++) { if(array[j] < root) { return false; } } //ÅжÏ×ó×ÓÊ÷ÊÇ·ñΪ¶þ²æËÑË÷Ê÷ bool left = true; if(i > 0) { left = isPostorder(array, i); } bool right = true; if(i < length - 1) { right = isPostorder(array + i, length- 1 - i); } //ÅжÏÓÒ×ÓÊ÷ÊÇ·ñΪ¶þ²æËÑË÷Ê÷ return (left && right); }
bool VerifySquenceOfBST(vector<int> sequence) { if(sequence.size() == 0) return false; else return isPostorder(sequence, 0, sequence.size()-1); }