描述:
輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同
二叉搜索樹也叫二叉排序樹,即左孩子的值全都小於根節點,右孩子的值全都大於根節點,根節點的左右孩子也是二叉搜索樹。
給定如下一顆二叉搜索樹:
(注:我寫的時候圖片顯示的是下面的二叉排序樹,現在竟然顯示的是別人的java項目結構圖!!!)
其後序遍歷爲:2 9 5 16 17 15 19 18 12。
現在假設給定了某個後序遍歷數組爲:2 9 5 16 17 15 19 18 12
我們從根節點出發,即節點12,如果此數組是某個二叉排序樹後續遍歷的結果,也就說數組中的數據必然可以分成兩部分:一部分是全小於12,一部分全大於12,我們先從數組找第一個大於12的數即16,那麼可以該數組可以被分成兩部分
第一部分:2 9 5
第二部分:16 17 15 19 18
要使根節點12滿足二叉排序樹的定義,那麼必定有第一部分全部小於12,第二部分全部大於12。
此時第一部分和第二部分又變成了根節點12的左右孩子要滿足二叉搜索樹的情況,第一部分表示的子樹的根節點爲5,第二部分表示的子樹的根節點爲18,即我們現在要判斷根節點爲5和根節點爲18的兩棵樹是否都滿足二叉排序樹的定義,這是一個遞歸的過程。
class ListNode{
int val;
ListNode next=null;
ListNode(int val) {
this.val=val;
}
}
public int findPosition(int[] sequence,int start,int end,int val){
//從sequence的start-end找到第一個大於val的位置
int i=start;
for(;i<=end;i++){
if(sequence[i]>val)
break;
}
return i;
}
public boolean isSquenceOfBST(int[] sequence,int start,int end){
if(end<0||start>=sequence.length)
return true;
int val=sequence[end];
int position=0;
if(start<end){
//將數組在position爲位置分成兩部分,左邊一部分必然全小於val,右邊一部分必然要全大於val
position=findPosition(sequence, start, end-1, val);
for(int i=position;i<=end;i++){
if(sequence[i]<val) //如果出現右邊部分有數字小於val則不符合二叉搜索樹的定義
return false;
}
}else{
return true;
}
//判斷左右子樹是否符合二叉搜索樹的定義
return isSquenceOfBST(sequence,start,position-1)&&
isSquenceOfBST(sequence, position, end-1);
}
/**
* 輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果
* */
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length<=0)
return false;
return isSquenceOfBST(sequence, 0, sequence.length-1);
}