劍指offer:二叉搜索樹的後續遍歷序列
阿新 • • 發佈:2019-03-27
一位 solution 解題思路 left back 劍指offer pan true ++
題目描述:
輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。
解題思路:
根據二叉搜索的性質,後序遍歷是先搜索左子樹,再右子數,最後是根結點。對應到序列中就是,序列的最後一位為根結點,從頭開始遍歷序列中一段連續子序列小於根結點,為左子樹,後一段連續子序列大於根結點,為右子樹。
舉個例子,序列為(2,4,3,6,7,5),則5為根結點,對應(2,4,3)都小於5,為左子樹,(6,7)大於5,為右子樹。再對每個子樹遞歸。
註意,對於初試為空的序列,返回的結果應該是false。因此在遞歸過程中遇到空的子序列,需要多一個判斷。或是重寫一個遞歸函數,遞歸函數中的空序列返回true,而原函數中的空序列單獨判斷。
代碼:
class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { if(sequence.size()==0) return false; if(sequence.size()==1) return true; vector<int> left; vector<int> right; int root = sequence[sequence.size()-1]; int i; for(i = 0; i<(sequence.size()-1); i++) { if(sequence[i]<root) left.push_back(sequence[i]); else break; } for(i = i+1; i<(sequence.size()-1); i++) { if(sequence[i]>root) right.push_back(sequence[i]);else return false; } if(left.size()==0 && right.size()==0) return true; if(left.size()==0 && VerifySquenceOfBST(right)) return true; if(right.size()==0 && VerifySquenceOfBST(left)) return true; if(VerifySquenceOfBST(left) && VerifySquenceOfBST(right)) return true; else return false; } };
劍指offer:二叉搜索樹的後續遍歷序列