劍指Offer-23.二叉搜索樹的後序遍歷序列(C++/Java)

題目:

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

分析:

二叉樹的後序遍歷也就是先訪問左子樹,再訪問右子樹,最後訪問根節點,因此不難發現,所給的數組最後一個元素必定是二叉搜索樹的根節點,而若是數組是二叉搜索樹的後續遍歷的話,就必定會根據數值劃分兩部分,左邊是根節點的左子樹,剩下的部分則是根節點的右子樹。左子樹的數值均小於根節點,右子樹的數值均大於根節點。數組

例如{5,7,6,9,11,10,8},8是二叉搜索樹的根節點,{5,7,6}是左子樹,{9,11,10}是右子樹。再遞歸判斷。spa

6是根節點,5是左子樹,7是右子樹,因爲只剩一個元素了,判斷停止,同理{9,11,10}也是如此。code

但若是不是後序遍歷的序列,如{7,4,6,5}blog

5是根節點,7,4,6三個元素沒有辦法劃分出左右子樹,由於二叉搜索樹的特性咱們知道,左子樹全部元素的值都小於根節點,右子樹的值均大於根節點,不管是{7},{4,6}仍是{7,4},{6}均不符合二叉搜索樹的性質,在編程實現的過程當中,咱們能夠遍歷數組,當出現第一個大於根節點的元素時,便認爲以前的全部元素時這個根節點的左子樹,而排除最後一個元素剩下的全部元素即是右子樹,查看右子樹中的元素若是有小於根節點的元素,即可以直接判斷不是二叉搜索樹的後續遍歷,若是沒有就遞歸執行下去。遞歸

程序:

C++io

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.size() == 0) return false;
        return helper(sequence, 0, sequence.size());
    }
    bool helper(vector<int> &v, int index, int length){
        if(length <= 1)
            return true;
        int i = 0;
        for(; i < length-1; ++i){
            if(v[index + i] > v[index + length -1])
                break;
        }
        for(int j = i; j < length-1; ++j){
            if(v[index + j] < v[index + length -1])
                return false;
        }
        return helper(v, index, i) && helper(v, index+i, length-i-1);
    }
};

Javaclass

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence.length == 0) return false;
        return helper(sequence, 0, sequence.length);
    }
    public boolean helper(int [] sequence, int index, int length){
        if(length <= 1)
            return true;
        //找到第一個大於根節點的元素偏移量,此元素右側序列爲右子樹(包括)
        int i = 0;
        for(; i < length - 1; ++i){
            if(sequence[index + i] > sequence[index + length -1])
                break;
        }
        //檢查右子樹元素是否都大於根節點
        for(int j = i; j < length - 1; ++j){
            if(sequence[index + j] < sequence[index + length -1])
                return false;
        }
        return helper(sequence, index, i) && helper(sequence, index+i, length-i-1);
    }
}
相關文章
相關標籤/搜索