二叉搜索樹的後序遍歷序列
阿新 • • 發佈:2017-08-22
sequence 二叉搜索樹 als pri 情況 keyword 否則 comm ofb
輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。
對於一個區間[begin,end]判斷是否是搜索二叉樹:
①取int val=arr[end];
②i從[begin,end-1]開始遍歷區間,直到找到一個大於val的元素break或者循環結束,此時的i是第一個大於val的元素或者是end,於是構建2個子數組是[begin,i-1]和[i,end-1].對這2個子數組再調用遞歸方法即可。
註意:上面有2個特殊情況,當begin<i-1即左子樹為null,於是數組第一個元素就大於val,於是i=begin,顯然begin>i-1,即begin>end或者i<end-1即右子樹為null,於是當[begin,end-1]所有元素都遍歷完成後都沒有找到大於val的元素,於是此時i=end,於是i>end-1,即begin>end。
邊界條件:遞歸判斷一個數組[a,b]是否是搜索二叉樹,終止條件就是某側的子樹為null,於是當遇到begin<i-1或者i<end-1就return結束遞歸即可,即邊界條件是:begin>end。
- //判斷一個數組是否是某搜索二叉樹的後序遍歷,遞歸,先判斷再分解
- public class Solution {
- public boolean VerifySquenceOfBST(int [] sequence) {
- //特殊輸入:如果整棵樹都是空樹那麽不是搜索二叉樹,如果只有部分子樹為空那麽可以是搜索二叉樹
- if(sequence.length==0) return false;
- //調用遞歸方法解決問題
- return this.process(sequence,0,sequence.length-1);
- }
- //遞歸方法,輸入一個數組和判斷的區間,判斷是否是一棵搜索二叉樹
- private boolean process(int[] arr,int begin,int end){
- //邊界條件
- if(begin>end) return true;
- //取最後一個元素作為分界值
- int val=arr[end];
- //①先判斷整個數組是否符合大小關系
- int i=begin;
- for(;i<=end-1;i++){
- if(arr[i]>val) break;
- }
- for(int j=i+1;j<=end-1;j++){
- if(arr[j]<val) return false;
- }
- //此時i是2個子數組的分界點
- boolean b1=this.process(arr,begin,i-1);
- boolean b2=this.process(arr,i,end-1);
- return b1&&b2;
- }
- }
二叉搜索樹的後序遍歷序列