输入一个整数数组,判断该数组是否是某二叉搜索树的后序遍历的结果。若是是则输出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))
}
}
复制代码