剑指offer[23]——二叉搜索树的后序遍历序列

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

首先什么是二叉搜索树呢,它是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树,如下图所示就是一个二叉搜索树:

image-20200313112016160

这道题目使用递归的方法解决,请看下面图示:

因为序列是后序遍历序列,所以我们可以判断出序列的最后一个元素是该树的根元素,其左子树的所有节点值全部小于它,右子数的所有节点值全部大于它。这样的话我们就可以去找一个边界,就是这个序列中第一个大于12的数,如上图所示我们找到的是第二位与第三位中间的位置。接下来我们就需要判断这个位置右边的数字是否全部大于12,该位置左边的所有数字是否全部小于12,但凡有一个不成立,就返回false。都成立的话,就将该位置左右两侧分割成两个数,再按照上述方法进行判断,直到序列长度为1或为空。

function VerifySquenceOfBST(sequence) {
  if (!sequence.length) { return false; }
  function charge(s) {
    if (s.length <= 1) { return true; }
    let root = s[s.length - 1];
    let rootIndex = s.findIndex(x => x > root);
    for (let i = 0; i < rootIndex; i++) {
      if (s[i] > root) { return false; }
    }
    if(rootIndex!=-1){
      for (let i = rootIndex; i < s.length - 1; i++) {
        if (s[i] < root) { return false; }
      }
    }
    return charge(s.slice(0, rootIndex)) && charge(s.slice(rootIndex, s.length - 1));
  }
  return charge(sequence);
}

猜你喜欢

转载自www.cnblogs.com/Jacob98/p/12485312.html