博客
关于我
【二叉树】已知后序与中序求先序
阅读量:549 次
发布时间:2019-03-09

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

已知后序与中序,求先序

在二叉树的遍历中,已知后序和中序,可以通过递归的方法实现先序遍历。这种方法利用了二叉树的特性,将后序与中序信息结合,高效地构建先序结果。

思路解析

  • 后序遍历特点

    在后序遍历中,根节点总是最后访问的节点。因此,后序的最后一个节点即为整个树的根节点。

  • 中序遍历特点

    中序遍历中,根节点的位置可以通过比较中序数组和后序数组来确定。具体来说,在中序数组中找到等于后序根节点的位置,左边即为左子树,右边即为右子树。

  • 递归构建先序

    • 确定根节点
      根据中序遍历数组,找到对应后序根节点的位置。
    • 划分子树
      左子树的根节点在后序数组中位于前序根节点的左侧,右子树的根节点位于右侧。
    • 递归遍历
      封闭左子树和右子树,依次进行先序遍历。
  • 代码实现

    #include 
    #include
    #include
    #include
    using namespace std;vector
    post, in;void pre_order(int root, int start, int end) { if (start > end) return; int i = start; while (i < end && in[i] != post[root]) { i++; } post[root] = pre ORDER LOGIC pre.push_back(post[root]); pre_order(root + i - end - 1, start, i - 1); pre_order(root - 1, i + 1, end);}int main() { int n, node; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &node); post.push_back(node); } for (int i = 0; i < n; i++) { scanf("%d", &node); in.push_back(node); } pre_order(n - 1, 0, n - 1); printf("%d", pre[0]); for (int i = 1; i < n; i++) { printf(" %d", pre[i]); } return 0;}

    递归逻辑解释

  • 初始化根节点

    根据后序数组确定根节点的位置(通常是最后一个节点),然后在中序数组中定位它的具体位置。

  • 划分子树范围

    根据当前根节点确定左子树和右子树的范围,分别调用递归函数进行处理。

  • 输出先序顺序

    在递归过程中按照先序方式输出节点,从而完成整个先序遍历的结果。

  • 通过以上方法,可以高效地将已知的后序和中序遍历结果转换为先序遍历顺序。这种方法在时间复杂度上为 O(n),能够在较短时间内处理较大的树结构。

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

    你可能感兴趣的文章
    课程总结
    查看>>
    认识CMake及应用
    查看>>
    CMake的主体框架
    查看>>
    实践:从简单CMake说起
    查看>>
    像素间的关系
    查看>>
    微积分(三)
    查看>>
    离散数学基础(一)
    查看>>
    Oracle
    查看>>
    软件工程应用
    查看>>
    数据科学
    查看>>
    论文报告/前沿文章
    查看>>
    Less
    查看>>
    JS模块化规范
    查看>>
    函数与高级变量
    查看>>
    机器学习:sklearn实现黑色星期五
    查看>>
    键盘事件
    查看>>
    超分辨率/去噪
    查看>>
    弱监督
    查看>>
    二 召回算法
    查看>>
    高级动态规划
    查看>>