題目:輸入一個整數數組,判斷該數組是否是某二叉搜索樹的後序遍歷的結果。若是是則返回true,不然返回false。假設輸入的數組的任意兩個數字都互不相同。ios
思路:由於是二叉搜索樹,因此每一個根結點的左子樹結點都比根結點小,右子樹比根結點大。
例如輸入{5,7,6,9,11,10,8},後序遍歷確定是根結點最後遍歷的,因此8爲根結點,而後由於5,7,6比8小,因此在8的左邊,9,11,10在右邊。以此類推這個數組符合。
例如輸入{7,4,6,5},5爲根節點,由於7大於5,因此沒有左子樹,但4又小於5,矛盾,因此不符合。面試
#include<iostream> #include<cstdio> #include<deque> using namespace std; bool VerifyBst(int sequence[], int length) { if (sequence == NULL || length <= 0) { return false; } int root = sequence[length-1]; //在二叉搜索樹中左子樹結點小於根結點 int i = 0; for (; i < length - 1; i++) { if (sequence[i] > root) { break; } } //右子樹大於根結點 int j = i; for (; j < length - 1; j++) { if (sequence[j] < root) { return false; } } //判斷左子樹是否是二叉搜索樹 bool left = true; if (i > 0) { left = VerifyBst(sequence, i); } //判斷右子樹是否是二叉搜索樹 bool right = true; if (i < length - 1) { right = VerifyBst(sequence + i, length - i - 1); } return (left && right); } int main() { int num[7] = {10,7,6,9,11,10,8}; bool result = VerifyBst(num, 7); if (result == 1) { cout << "true" << endl; } else { cout << "false" << endl; } //cout << (result == 1)?true : false << endl; return 0; }
相關題目:
輸入一個整數數組,判斷該數組是否是某二叉搜索樹的前序遍歷的結果。這和前面的問題的後序遍歷很相似,只是在前序遍歷獲得的序列中,第一個數字是根節點的值。數組
觸類旁通:
若是面試題是要求處理一棵二叉樹的遍歷序列,咱們能夠先找到二叉樹的根結點,再基於根結點把整棵樹的遍歷序列拆分紅左子樹對應的子序列和右子樹對應的子序列,接下來再遞歸地處理這兩個子序列。spa