二叉搜索树的后序遍历序列(中等难度)

简介: 二叉搜索树的后序遍历序列(中等难度)

目录

题目概述(中等难度)

题目链接

点我进入链接

思路与代码

思路展现

这块的思路就看这个大佬的题解吧:写的很详细

点此进入题解

代码示例

class Solution {
    public boolean verifyPostorder(int[] postorder) {
        return helper(postorder, 0, postorder.length - 1);
}
boolean helper(int[] postorder, int left, int right) {
    //如果left==right,就一个节点不需要判断了,如果left>right说明没有节点,
    //也不用再看了,否则就要继续往下判断
    //并且最重要的一点是这块要判断left大于等于right的原因是后面我们postorder[right]中的right值会有成为-1的时候,此时数组下标越界会报异常
    if (left >= right)
        return true;
    //因为数组中最后一个值postorder[right]是根节点,这里从左往右找出第一个比
    //根节点大的值,他后面的都是根节点的右子节点(包含当前值,不包含最后一个值,
    //因为最后一个是根节点),他前面的都是根节点的左子节点
    int mid = left;
    int root = postorder[right];
    while (postorder[mid] < root){
        mid++;
    }
    //tmp用于存储第一个比我们根节点大的值的下标
    int temp = mid;
    //因为postorder[mid]前面的值都是比根节点root小的,
    //我们还需要确定postorder[mid]后面的值都要比根节点root大,
    //如果后面有比根节点小的直接返回false
    while (temp < right) {
        if (postorder[temp++] < root)
            return false;
    }
    //然后对左右子节点进行递归调用,判断其他子树是否也符合我们的规律
    return helper(postorder, left, mid - 1) && helper(postorder, mid, right - 1);
  }
}

时间复杂度 O(N^2)

每次调用 helper(i,j)减去一个根节点,因此递归占用 O(N) ;最差情况下(即当树退化为链表),每轮递归都需遍历(while循环)树中的所有节点,占用 O(N) 。所以相当于递归中套了循环,最终时间复杂度为O(N^2)


空间复杂度 O(N)

最差情况下(即当树退化为链表),递归深度将达到 N


注意事项

第一点

关于上述代码有以下注意点:

    if (left >= right)
          return true;

解析:如果left==right,就一个节点不需要判断了,如果left>right说明没有节点,也不用再看了,否则就要继续往下判断

并且最重要的一点是这块要判断left大于等于right的原因是后面我们postorder[right]中的right值会有成为-1的时候,此时数组下标越界会报异常,而当left>=right后,此时就走不到postorder[right]这条语句了,也就不会报异常了.


第二点

2.png

这块的写法是不会超过时间限制的写法,假如此时我们按照以下写法就会超时:

2.png







相关文章
代码随想录Day19 LeetCode T669修剪二叉搜索树 LeetCode T108将有序数组转化为二叉搜索树 T538 把二叉搜索树转化为累加树
代码随想录Day19 LeetCode T669修剪二叉搜索树 LeetCode T108将有序数组转化为二叉搜索树 T538 把二叉搜索树转化为累加树
44 0
代码随想录Day17 LeetCode T98 验证二叉搜索树 T530 二叉搜索树的最小绝对差 T501 二叉搜索树中的众数 T236二叉搜索树的最近公共祖先
代码随想录Day17 LeetCode T98 验证二叉搜索树 T530 二叉搜索树的最小绝对差 T501 二叉搜索树中的众数 T236二叉搜索树的最近公共祖先
55 0
32_将有序数组转换为平衡二叉搜索树
32_将有序数组转换为平衡二叉搜索树
|
6月前
|
监控 算法 测试技术
【动态规划】【树形dp】【C++算法】968监控二叉树
【动态规划】【树形dp】【C++算法】968监控二叉树
算法训练Day21|530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先
算法训练Day21|530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先
|
机器学习/深度学习 存储 人工智能
代码随想录训练营day21| 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先...
代码随想录训练营day21| 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先...
每日三题-验证二叉搜索树、二叉树的直径、把二叉搜索树转换为累加树
每日三题-验证二叉搜索树、二叉树的直径、把二叉搜索树转换为累加树验证二叉搜索树验证二叉搜索树v
62 2
每日三题-验证二叉搜索树、二叉树的直径、把二叉搜索树转换为累加树
从前序与中序遍历序列构造二叉树(中等难度)
从前序与中序遍历序列构造二叉树(中等难度)
98 0
从前序与中序遍历序列构造二叉树(中等难度)
树的子结构(中等难度,好题目)
树的子结构(中等难度,好题目)
93 0
树的子结构(中等难度,好题目)
|
存储
二叉搜索树与双向链表(中等难度)(好题目)
二叉搜索树与双向链表(中等难度)(好题目)
114 0
二叉搜索树与双向链表(中等难度)(好题目)