zoukankan      html  css  js  c++  java
  • 剑指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);
    }
    
  • 相关阅读:
    浅谈MSSQL2012中的列存储索引(columnstore indexes)
    《高性能SQL调优精要与案例解析》新书样章
    关系库执行计划中三种最常用连接方式的伪码实现
    python基础-字符串
    python基础-文件和目录
    python基础-列表
    python基础-对象
    python基础-入门
    python算法-二叉树广度优先遍历
    Python算法-二叉树深度优先遍历
  • 原文地址:https://www.cnblogs.com/Jacob98/p/12485312.html
Copyright © 2011-2022 走看看