博客
关于我
剑指 Offer 33. 二叉搜索树的后序遍历序列
阅读量:797 次
发布时间:2023-03-28

本文共 1363 字,大约阅读时间需要 4 分钟。

二叉搜索树后序遍历序列验证

后序遍历与二叉搜索树定义

后序遍历(Postorder Traversal)是指遍历树的顺序为“左、右、根”。在二叉搜索树(Binary Search Tree, BST)中,这种遍历方式能够验证某个序列是否为二叉搜索树的后序遍历。根据定义:

  • 后序遍历定义:遍历顺序为“左子树、右子树、根节点”。
  • 二叉搜索树定义:左子树中所有节点的值小于根节点的值;右子树中所有节点的值大于根节点的值;其左右子树也分别为二叉搜索树。
  • 通过递归的方式,可以验证所有子树的正确性(即其后序遍历是否满足二叉搜索树定义)。若所有子树都正确,则该序列即为二叉搜索树的后序遍历。


    递归解析

    递归函数 recur(postorder, i, j) 用于验证给定区间 [i, j] 是否为二叉搜索树的后序遍历序列。以下是递归逻辑:

    终止条件

    i >= j 时,说明此子树节点数量≤1,无需判别正确性,直接返回 true

    递推工作

  • 划分左右子树

    • 从区间起点 i 开始,找到第一个大于根节点值的节点,索引记为 m
    • 左子树区间为 [i, m-1],右子树区间为 [m, j-1],根节点索引为 j
  • 判断是否为二叉搜索树

    • 左子树区间 [i, m-1] 内的所有节点都应小于 postorder[j]。由于划分左右子树时已经保证左子树区间的正确性,只需验证右子树区间 [m, j-1] 是否满足条件。
    • 右子树区间内的所有节点都应大于 postorder[j]。实现方式是遍历区间,当遇到≤ postorder[j] 的节点时,立即跳出,返回 false
  • 返回值

    • 若所有子树都正确,返回 true;否则返回 false
  • 递归实现

    boolean recur(int[] postorder, int i, int j) {    if (i >= j) {        return true;    }    int p = i;    // 找到第一个大于根节点的值的索引    while (postorder[p] < postorder[j]) {        p++;    }    int m = p;    // 找到第一个等于或大于根节点的值的索引    while (postorder[p] > postorder[j]) {        p++;    }    // 判断根节点是否正确,左子树和右子树是否正确    return p == j && recur(postorder, i, m - 1) && recur(postorder, m, j - 1);}

    测试示例

    @Testpublic void test() {    boolean b = verifyPostorder(new int[]{1, 3, 2, 6, 5});}

    复杂度分析

    时间复杂度

    • O(N^2):每次递归调用 recur(i, j) 减去一个根节点,最坏情况下(树退化为链表)每轮递归都需要遍历所有节点。

    空间复杂度

    • O(N):最坏情况下(树退化为链表),递归深度达到 N

    代码解释

    上述代码实现了后序遍历序列的验证逻辑。通过递归划分左右子树并验证其正确性,确保所有子树都符合二叉搜索树的定义。

    转载地址:http://blhfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现naive string search字符串搜索算法(附完整源码)
    查看>>
    Objective-C实现natural sort自然排序算法(附完整源码)
    查看>>
    Objective-C实现nested brackets嵌套括号算法(附完整源码)
    查看>>
    Objective-C实现nevilles method多项式插值算法(附完整源码)
    查看>>
    Objective-C实现newtons second law of motion牛顿第二运动定律算法(附完整源码)
    查看>>
    Objective-C实现newton_raphson牛顿拉夫森算法(附完整源码)
    查看>>
    Objective-C实现NLP中文分词(附完整源码)
    查看>>
    Objective-C实现NLP中文分词(附完整源码)
    查看>>
    Objective-C实现not gate非门算法(附完整源码)
    查看>>
    Objective-C实现NumberOfIslands岛屿的个数算法(附完整源码)
    查看>>
    Objective-C实现n皇后问题算法(附完整源码)
    查看>>
    Objective-C实现OCR文字识别(附完整源码)
    查看>>
    Objective-C实现odd even sort奇偶排序算法(附完整源码)
    查看>>
    Objective-C实现page rank算法(附完整源码)
    查看>>
    Objective-C实现PageRank算法(附完整源码)
    查看>>
    Objective-C实现pascalTriangle帕斯卡三角形算法(附完整源码)
    查看>>
    Objective-C实现perfect cube完全立方数算法(附完整源码)
    查看>>
    Objective-C实现PNG图片格式转换BMP图片格式(附完整源码)
    查看>>
    Objective-C实现pollard rho大数分解算法(附完整源码)
    查看>>
    Objective-C实现quick select快速选择算法(附完整源码)
    查看>>