問題形貌
輸入一個整數數組,推斷該數組是否是某二叉搜刮樹的後序遍歷的效果。如果是則輸出Yes,不然輸出No。假定輸入的數組的恣意兩個数字都互不雷同。
剖析
所謂二叉搜刮樹,也稱為二叉搜刮樹、有序二叉樹(ordered binary tree)或排序二叉樹(sorted binary tree),是指一棵空樹或許具有以下性子的二叉樹:
- 若恣意節點的左子樹不空,則左子樹上一切節點的值均小於它的根節點的值;
- 若恣意節點的右子樹不空,則右子樹上一切節點的值均大於它的根節點的值;
- 恣意節點的左、右子樹也離別為二叉查找樹;
- 沒有鍵值相稱的節點。
那末關於二叉搜刮樹的後序遍歷的序列來講,末了一個元素等於它的根節點,序列的前某部份元素悉數小於末了一個元素,序列的后某部份元素全大於末了一個元素。然後關於這兩部份來講,又離別相符這些特性,能夠遞歸的搜檢下去。
遞歸完成
function VerifySquenceOfBST(s)
{
if(s.length === 0)
return false;
return judge(s, 0, s.length-1);
}
function judge(a, l, r) {
if(l >= r)
return true;
var p1 = r;
while(p1 > l && a[p1-1] > a[r]) {
p1--;
}
var p2 = p1-1;
while(p2 >= l){
if(a[p2] > a[r])
return false;
p2--;
}
return judge(a, l, p1-1) && judge(a, p1, r-1);
}
非遞歸完成
關於一個二叉搜刮樹來講,根節點的左子樹每一個節點的值一定小於右子樹每一個節點的值,所以能夠不停的去去掉序列的末了一個值,而且把剩下的部份分紅小於末了一個值和大於末了一個值的兩部份,只要能分出來那就申明相符二叉搜刮樹的定義,不然就不相符。
function VerifySquenceOfBST(s)
{
if(s.length === 0)
return false;
var start = 0, end = s.length-1;
while(end !== 0) {
while(s[start] < s[end]){
start++;
}
while(s[start] > s[end]){
start++;
}
if(start < end)
return false;
end--;
start = 0;
}
return true;
}