美文网首页
《剑指offer第二版》面试题33:二叉搜索树的后序遍历序列(j

《剑指offer第二版》面试题33:二叉搜索树的后序遍历序列(j

作者: castlet | 来源:发表于2020-04-12 12:27 被阅读0次

    题目描述

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

    解题思路:

    1. 二叉搜索树的左子树所有节点的值均小于根节点的值,右子树所有节点的值均大于根节点的值。
    2. 后序遍历的最后一个数字为二叉树的根节点。
    3. 由于没有重复数字,因此可遍历序列,找到第一个大于根据点的位置index,则index之前为左子树,index之后为右子树。
    4. 检查右子树的序列值是否都大于根节点的值。
      1. 如果都大于,则index为界限,将序列分为前后两个序列,分别对着两个序列递归检查。
      2. 如果存在小于根节点的值,则不符合搜索二叉树的定义,直接返回false。

    代码

    boolean verifySequenceOfBST(int[] seqs){
        return verifySequenceOfBST(seqs, 0, seqs.length - 1);
    }
    boolean verifySequenceOfBST(int[] seqs, int start, int end){
        if (seqs == null ) {
            return false;
        }
    
        if ((end - start) <= 0) {
            return true;
        }
    
        int rootValue = seqs[end];
    
        // 找到左右子树的分解点
        int i = start;
        while (seqs[i] < rootValue) {
            i++;
        }
    
        // 验证右子树的序列值是否比root小
        for (int j = i + 1; j <= end; j++ ) {
            if (seqs[j] < rootValue) {
                // 说明非二叉搜索树
                return false;
            }
        }
    
        return verifySequenceOfBST(seqs, start, i - 1) && verifySequenceOfBST(seqs, i, end - 1);
    }
    

    相关文章

      网友评论

          本文标题:《剑指offer第二版》面试题33:二叉搜索树的后序遍历序列(j

          本文链接:https://www.haomeiwen.com/subject/cwuvmhtx.html