问题描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
5
/
2 6
/
1 3
示例 1:
输入: [1,6,3,2,5]
输出: false
示例 2:
输入: [1,3,2,6,5]
输出: true
代码
var verifyPostorder = function(postorder) {
// 如果后序遍历序列小于2,则直接返回true
if (postorder.length < 2) return true
let i = 0 ;
let len = postorder.length;
let root = postorder.pop();// 根节点是最后一个
for (; i < len-1; i++) {
if (postorder[i] > root) break;// 找到右子树的起始位置
}
let result = postorder.slice(i, len - 1).every(x => x > root);// 判断右子树中的每一项是否都大于根节点,只要有一项不大于,则返回fasle
if (result){
return verifyPostorder(postorder.slice(0, i)) && verifyPostorder(postorder.slice(i, len-1));// 分别对左子树和右子树进行递归
}else{
return false
}
};