輸入一個整數數組,判斷該數組是否是某二叉搜索樹的後序遍歷的結果。若是是則輸出Yes,不然輸出No。假設輸入的數組的任意兩個數字都互不相同。
javascript
假設給定的序列是[4,6,7,5]
,根據二叉搜索樹的性質以及後序遍歷的規律,咱們不可貴出下面這樣的樹:java
左-->右-->根
5
/ \
4 7
/
6
複製代碼
根據上面的思路,咱們能夠得出這樣的思路:數組
咱們再來看一個複雜點的例子[4,8,6,12,16,14,10]
這裏先給出樹結構。bash
10
/ \
6 14
/ \ / \
4 8 12 16
複製代碼
根據上面的分析,咱們很容易知道[4,6,8]
是左子樹,[12,16,14]
是右子樹。函數
root = 10
left = [4,8,6]
right = [12,16,14]
// 由於二叉搜索樹的子樹一樣是一顆二叉搜索樹,因此咱們重複上述步驟
**************
對於左子樹來講
root = 6
left = [4] //只有一個元素說明到達葉子結點
right = [8]
**************
對於右子樹來講
root = [14]
left = [12]
right = [16]
**************
咱們發現,根據序列生成的樹符合二叉搜索樹的定義,因此結果爲true
複製代碼
這些都是符合條件的遍歷結果,那不符合條件的呢?spa
咱們將上面的例子稍微修改一下,假設給定的序列是:[4,12,8,6,16,14,10]
code
root = 10;
left = [4]
right = [12,8,16,14]
**********
對於左子樹來講,很容易判斷是知足二叉搜索樹的。
對於右子樹
right = [12,8,16,14]中有一個元素小於 root(10),不符合條件,所以這不是一棵二叉搜索樹,直接返回false.
假設right = [12,20,18,11] 所有都大於root(10),但它並非一顆二叉搜索樹
11
/
18
/\
12 20
所以咱們須要進行遞歸判斷.
複製代碼
經過上面的分析,咱們也能夠知道,咱們只須要判斷右子樹是否是一棵二叉搜索樹就能夠了。遞歸
因而咱們很輕鬆就寫出下面的函數ip
function VerifySquenceOfBST(sequence) {
if(!sequence.length){
return false
}
let root = sequence.pop() //5
let start = sequence.findIndex((val)=>{
return val>root
})
return start===-1?true:isBST(root,sequence.slice(start))
function isBST(root,tree){ //root 5 tree[1,2,3,4]
if(!tree.length){ // 若是數組數爲空,則返回true
return true
}
let index = tree.findIndex((val)=>{ //index === -1
return val<root
})
if(index != -1){
return false
}
root = tree.pop() //root 7 tree[6]
let start = tree.findIndex((val)=>{
return val>root //
})
return tree.length===1?true:isBST(root,tree.slice(start))
}
}
複製代碼