對於此題的解釋,在註釋中解釋的十分詳細,就不在此贅述。另外。。之前的一篇文章中提到了關於二叉樹的詳細說明,以及非遞歸、遞歸遍歷二叉樹的多種方法。
鏈接在此~二叉樹之非遞歸遍歷 漫談二叉樹之遞歸遍歷
廢話少說,代碼搞起
/**
* 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。
}
}