二叉树--二叉搜索树的后序遍历序列

Posted 算法和数据结构

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树--二叉搜索树的后序遍历序列相关的知识,希望对你有一定的参考价值。

来源:LeetCode

难度:中等

描述:

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

        假设咱们有一棵二叉搜索树如下:

示例1:

二叉树(六)--二叉搜索树的后序遍历序列


示例2:

二叉树(六)--二叉搜索树的后序遍历序列


分析:

        题目就是给一个数组,让咱们判断该数组是否是一棵二叉搜索树的后序遍历转变来的。

       首先咱们知道后续遍历一句话描述就是左右根,对二叉树的遍历有兴趣的同学可以查看,而二叉搜索树的特点是任意一个左子树节点都比根节点小,任意一个右子树节点都比根节点大。

       将这两个特点合起来可知,如果输入的数组是二叉搜索树的后序遍历结果,那么最后一个根节点就是原二叉树的根,顺着根节点往前倒序遍历所有比该元素大的都是根节点的右子树,剩下的都是比根节点小的都是左子树,然后左右子树分别又符合上述特点...


解题


方法一:递归分治法

思路:如分析,把数组最后一个元素作为根节点,将根节点前面所有连续比其大的元素作为右子树节点,剩下的作为左子树节点,其中左子树中不能有比根节点大的元素,之后左右子树节点递归上述操作


代码:

 1public static boolean verifyPostorder(int[] postorder) {
2    if (postorder == null || postorder.length <= 1) {
3        return true;
4    }
5    //对整个数组进行判断
6    return check(postorder, 0, postorder.length - 1);
7}
8
9private static boolean check(int[] postorder, int start, int end) {
10    //start大于等于end,遍历完毕
11    if (start >= end) {
12        return true;
13    }
14    //最后一个节点为根节点
15    int root = postorder[end];
16    int rightIndex = end - 1;
17    for (; rightIndex >= start; rightIndex--) {
18        //找到连续比根节点大的元素作为右子树节点
19        if (postorder[rightIndex] < root) {
20            break;
21        }
22    }
23    //剩余元素为根节点左子树节点
24    int leftIndex = start;
25    while (leftIndex < rightIndex) {
26        //左子树中不能存在比根节点大的元素
27        if (postorder[leftIndex] > root) {
28            return false;
29        }
30        leftIndex++;
31    }
32    //递归左子树节点和右子树节点
33    return check(postorder, start, rightIndex) 
34            && check(postorder, rightIndex + 1, end - 1);
35}

时间复杂度:O(n2)  当二叉搜索树为一根链表时,每次都要遍历剩余整个数组元素,所以为n*n

空间复杂度:O(n) 


以上仅是个人思路解法,觉得还不错欢迎点赞关注分享


往期精彩推荐



扫描下方二维码,关注公众号,更多精彩等你发现


以上是关于二叉树--二叉搜索树的后序遍历序列的主要内容,如果未能解决你的问题,请参考以下文章

二叉树--二叉搜索树的后序遍历序列

二叉树搜索树的后序遍历序列

二叉搜索树的后序遍历

二叉搜索树的后序遍历序列(剑指offer-23)

⭐算法入门⭐《二叉树 - 二叉搜索树》中等01 —— LeetCode 剑指 Offer 33. 二叉搜索树的后序遍历序列

⭐算法入门⭐《二叉树 - 二叉搜索树》中等02 —— LeetCode 剑指 Offer 33. 二叉搜索树的后序遍历序列