劍指Offer-二叉搜索樹的後序遍歷序列

題目描述

輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。

首先我們給出二叉搜索樹的定義:

二叉搜索樹,也稱有序二叉樹,排序二叉樹,是指一棵空樹或者具有下列性質的二叉樹:

1. 若任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;

2. 若任意節點的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;

3. 任意節點的左、右子樹也分別爲二叉查找樹。

4. 沒有鍵值相等的節點。

根據後序遍歷的定義,先左右子樹後根節點,所以可以判斷一個後序遍歷序列最後一個必然爲根節點,前半部分爲左子樹的遍歷序列,後半部分(除最後一個)爲右子樹的遍歷序列
思路:

1)若序列長度爲1,則爲後序遍歷序列,返回true,只有一個根節點;若無空序列,則返回false

2)根據最後一個根節點劃分前面的序列爲左子樹序列A,右子樹序列B

(劃分過程中若出現,後半序列有小於根節點的情況,則不符合二叉搜索樹定義,返回false,代碼中標紅)

3)遞歸判斷A,B是否爲二叉搜索樹的後序遍歷序列 (非空序列)

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.size() == 0)
            return false;
        if(sequence.size() == 1)
            return true;
        int size = sequence.size();
        int rootvalue = sequence[size-1];
        vector<int> sequence1,sequence2;
        int i,j;
        for(i = 0; i < size; ++ i){
            if(sequence[i] < rootvalue)
                sequence1.push_back(sequence[i]);
            else
                break;
        }
        cout << "i = " << i << endl;
        j = i;
        for(;i < size-1; ++i){
             if(sequence[i] > rootvalue)
                sequence2.push_back(sequence[i]);
            else
                return false;
        }
        bool res1 = true, res2 = true;
        if(j>0){
            res1 = VerifySquenceOfBST(sequence1);
        }
        if(size-j>1){
            res2 = VerifySquenceOfBST(sequence2);
        }
        return res1&&res2;     
    }
};


發佈了85 篇原創文章 · 獲贊 98 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章