输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
因为是后序遍历,所以根节点是最后一个元素。然后前面序列分为 2 部分,有一部分是左子树,有一部分是右子树。
根据二叉搜索树的性质,左子树的元素一定小于最后一个元素,右子树的元素一定大于最后一个元素。
根据这个思路,一直递归下去即可。只要所有部分都满足二叉搜索树的性质,那么符合条件。
/*** 判断是否是二叉搜索树的后序遍历结果* @param {Array} tailOrder 后序遍历顺序*/function isBST(tailOrder) {// 空序列代表空树, 这里认为是BSTif (tailOrder.length === 0) {return true;}const length = tailOrder.length;let root = tailOrder[length - 1],i,j;// 找到左子树for (i = 0; i < length - 1 && tailOrder[i] < root; ++i);// 找到右子树for (j = i; j < length - 1 && tailOrder[j] > root; ++j);// 如果没有遍历完, 说明不是左边部分小,右边部分大的分布// 显然,不符合后序遍历的定义if (j !== length - 1) {return false;}// 处理左右子树let left = isBST(tailOrder.slice(0, i));let right = isBST(tailOrder.slice(i, length - 1));return left && right;}/*** 以下是测试代码*/console.log(isBST([5, 7, 6, 9, 11, 10, 8]));console.log(isBST([4, 3, 2, 1]));console.log(isBST([7, 4, 6, 5]));