剑指Offer——二叉搜索树的后序遍历序列(JS实现)
原创
©著作权归作者所有:来自51CTO博客作者wb59770b05237ae的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目描述
解题思路
- 本题关键点在于:二叉搜索树的后序遍历序列的最后一个元素是根节点,左子树均小于根节点,右子树均大于根节点
- 使用递归是本题的解题方法
- 本题需要额外考虑的情况在于有的序列是没有右子树的,如果没有右子树,那么分割左右子树的位置就是根节点所在的位置,默认右子树是一个空数组
解题代码
var verifyPostorder = function(postorder) {
// !本题的解题关键:二叉搜索树的后序遍历,最后一个元素是根节点
// 如果输入的数组长度小于2,则返回true
let len = postorder.length;
if (len < 2) return true;
// 区分左右子树
let flag = 0;
// 找到根节点
let root = postorder[len-1];
for (let i = 0; i < postorder.length;i++) {
if (postorder[i] > postorder[len-1]) {
flag = i;
break;
}
if (i === len-1) {
flag = i;
}
}
// 左子树
let leftTree = postorder.slice(0,flag);
// 右子树
let rightTree = postorder.slice(flag,len-1);
// 如果右子树的每一个节点都大于根节点,则继续递归判断,反之为false
if (rightTree.every((value) => value > root)) {
return verifyPostorder(leftTree) && verifyPostorder(rightTree);
} else {
return false;
}
};
总结(本题给我们的启示思路)
- 启示一:学会使用递归求解
- 启示二:知道二叉搜索树的后序遍历序列的最后一个节点是根节点
- 启示三:知道没有右子树的序列,按照空数组来进行处理