1. 程式人生 > >劍指offer:二叉搜索樹的後續遍歷序列

劍指offer:二叉搜索樹的後續遍歷序列

一位 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:二叉搜索樹的後續遍歷序列