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

   對於此題的解釋,在註釋中解釋的十分詳細,就不在此贅述。另外。。之前的一篇文章中提到了關於二叉樹的詳細說明,以及非遞歸、遞歸遍歷二叉樹的多種方法。

   鏈接在此~二叉樹之非遞歸遍歷  漫談二叉樹之遞歸遍歷

   廢話少說,代碼搞起

/**
 * Created by zhangshuyou on 2015/5/23.
 */

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

import java.util.Arrays;

/**
 * 在後序遍歷得到的序列中,最後一個數字是樹的根結點的值。
 * 數組前面的數字可以分爲兩部分,
 * 第一部分是左子樹結點的值,均小於根結點的值;
 * 第二部分是右子樹結點的值,均大於根結點的值。
 *
 * $$規律1:數組中第一個數字可以判斷此二叉搜索樹是否含有左子樹
 * $$規律2:當找到第一個大於數組末尾元素的值,此處爲右子樹和左子樹的分界點
 * $$規律3:然後以規律2再分解數組尋找結點
 */
public class Solution {

    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence == null || sequence.length <= 0)
            return false;
        int root = sequence[sequence.length - 1];  //根結點的值
        //二叉搜索樹中,左子樹的結點小於根結點
        int i = 0;
        for(; i < sequence.length - 1;++i){  //在去掉根元素之前尋找
            if(sequence[i] > root){  //當遇到第一個大於根結點的值就停止,此時找到了左右子樹的分界點
                break;
            }
        }
        //在二叉搜索樹中,右子樹的結點值大於根結點
        int j = i;
        for(; j < sequence.length - 1;j++){
            if(sequence[j] < root)
                return false;
        }
        //判斷左子樹是不是二叉搜索樹
        boolean left = true;
        boolean right = true;
        if(i > 0){
            //當取得了左子樹後,通過遞歸對左子樹進行檢查,檢查的位置是數組的0 -- i。(此處需要複製數組)
            left = VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, i));
        }
        if(i < sequence.length - 1){
            //同上~ =。=
            right = VerifySquenceOfBST(Arrays.copyOfRange(sequence , i , sequence.length - 1));
        }
        return (left && right);  //當左右子樹均成立,返回true;不成立返回false。
    }

}

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