牛客網《劍指Offer》 程式設計 23. 二叉樹的後序遍歷序列
阿新 • • 發佈:2018-12-11
題目描述
輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣列的任意兩個數字都互不相同。
解題思路
二叉搜尋樹的特點:後序遍歷的時候最後一個數是根節點。前面的數分為兩個部分,本別是左子樹部分和右子樹部分。左子樹不部分的所有數都比根節點小;右子樹部分的所有數都比根節點大。
因此可以這樣判定:
如果該二叉樹空樹,則返回false;
如果不為空,那麼確定根節點為最後一個數。
以該數值為分界,將陣列分成兩個部分,前半部分為左子樹,後半部分為右子樹。(左右子樹都可能為空)
只有當左右子樹都為二叉搜尋樹的時候,該樹才為二叉搜尋樹。所以接下來判斷左右子樹。
左子樹一定為空或者是全都是小於根節點的數,不用逐個比較左子樹中的數值和根節點的數值,直接繼續判斷左子樹是否為二叉搜尋樹。(遞迴)。
首先逐個判斷右子樹中所有數值是否都大於根節點值,如果不是,則右子樹不是二叉搜尋樹;如果是,則繼續判斷右子樹是否是二叉搜尋樹(遞迴)。
最後 當左子樹和右子樹都是二叉搜尋樹的時候,才能夠說明該樹是二叉搜尋樹。
程式碼實現
class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { if(sequence.empty()){return false;} int len=sequence.size(); int root=sequence[len-1]; int idx=0; vector<int> leftTree; vector<int> rightTree; bool left=true; bool right=true; while(idx<len-1&&sequence[idx]<root){ idx++; } if(idx!=0)//左子樹不為空,則接著判斷是左子樹是否是BST { //leftTree(sequence,sequence+idx); leftTree.insert(leftTree.begin(),sequence.begin(),sequence.begin()+idx); left=VerifySquenceOfBST(leftTree); } if(idx!=len-1){//因為在len-1位置上的元素是根元素 for(int j=idx;j<len-1;j++){ if(sequence[j]<root){ right=false; break; } } if(right){ rightTree.insert(rightTree.begin(),sequence.begin()+idx,sequence.begin()+len-1); right=VerifySquenceOfBST(rightTree); } } return left&&right; } };