美文网首页
面试题33. 二叉搜索树的后序遍历序列

面试题33. 二叉搜索树的后序遍历序列

作者: 周英杰Anita | 来源:发表于2020-03-01 14:51 被阅读0次

题目描述:

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

参考以下这颗二叉搜索树:

     5
    / \
   2   6
  / \
 1   3

示例 1:

输入: [1,6,3,2,5]
输出: false

示例 2:

输入: [1,3,2,6,5]
输出: true

提示:

数组长度 <= 1000

思路:

1、在后续遍历所得的序列中,最后一个数字是树的根节点的值;
2、数组中前面的数组可以分为两部分:第一部分是树的左子树,它们都比根节点的值小,第二部分是树的右子树,它们都比根节点的值大;
3、我们再用相同的办法确定左右子树的结构,这就是一个递归的过程。
4、递归过程:确定左右子树的左右边界,右边界的值一定是当前子树的根节点的值;从头开始遍历,当找到第一个比根节点大的数,这个数前面的就是左子树,从这个值起,后面的就是右子树。如果后面的数有一个比根节点小,就不满足条件,返回false;在递归过程中,要考虑只有左子树,或者只有右子树的情况;

Java解法(递归):

class Solution {
    public boolean verifyPostorder(int[] postorder) {
        if(postorder == null) return false;
        if(postorder.length <= 2) return true;
        return verifysub(postorder, 0, postorder.length - 1);
    }

    public boolean verifysub(int[] subarry, int left, int right)
    {
        if(left >= right) return true;
        int root = subarry[right];
        int mid = left;
        for(; mid < right; mid++)
        {
            if(subarry[mid] > root) break;
        }
        int j = mid;
        for(; j < right; j++)
        {
            if(subarry[j] < root) return false;
        }
        return verifysub(subarry, left, mid -1) && verifysub(subarry, mid, right -1);
    }
}

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof

相关文章

网友评论

      本文标题:面试题33. 二叉搜索树的后序遍历序列

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