• 剑指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);
    }
    
  • 相关阅读:
    layui 标签页切换
    m1配置多个git账户
    sqlserver 获取表和字段的注释方法
    springboot+mybatisPlus 配置多数据源--转载
    nginx 配置静态网页和反向代理
    ORA-01000: maximum open cursors exceeded
    重装系统我们选择FAT还是NTFS?U盘和硬盘格式化两者选谁?
    2、条件表达式
    1、javascript 知识拓展
    1_maven 问题
  • 原文地址:https://www.cnblogs.com/Jacob98/p/12485312.html
Copyright © 2020-2023  润新知