題目描述
輸入一個整數數組,判斷該數組是不是某二叉搜索樹(二叉排序樹)的後序遍歷的結果。如果是則輸出Yes,否則輸出No。
假設輸入的數組的任意兩個數字都互不相同。
解題思路
後序遍歷:左——右——根 ,且 左 < 根 < 右
突破口:後序遍歷到的最後一個結點就是根節點,之前遍歷到的結點小於根結點則爲左子樹,大於根節點則爲右子樹
思路:
1、確定root;
2、遍歷序列(除去root結點),找到第一個大於root的位置,則該位置左邊爲左子樹,右邊爲右子樹;
3、遍歷右子樹,若發現有小於root的值,則直接返回false;
4、分別判斷左子樹和右子樹是否仍是二叉搜索樹(即遞歸步驟1、2、3)。
具體代碼
• C++
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(!sequence.size())
return false;
return judge(sequence,0,sequence.size()-1);
}
// 判斷是否爲二叉排序樹
// start表示數組起始位,end表示數組終點位
bool judge(vector<int> &sequence, int start, int end){
if(start >= end)
return true;
int pivot; //第一個大於根節點的位置
for(pivot = start; sequence[pivot] < sequence[end]; pivot ++); //查找分界點
for(int i = pivot; i<=end; i++)
// 若該分界點的右邊有小於根結點的數,false
if(sequence[i] < sequence[end])
return false;
return judge(sequence,start,pivot-1) && judge(sequence,pivot,end-1);
}
};
• Java
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length <= 0)
return false;
return judge(sequence,0,sequence.length-1);
}
public boolean judge(int [] sequence,int start,int end){
if(start>=end)
return true;
int pivot;
for(pivot = start; sequence[pivot] < sequence[end]; pivot++); //查找分界點
for(int i = pivot; i <= end; i++)
if(sequence[i] < sequence[end])
return false;
return judge(sequence,start,pivot-1) && judge(sequence,pivot,end-1);
}
}