📌  相关文章
📜  国际空间研究组织 | ISRO CS 2008 |问题 70(1)

📅  最后修改于: 2023-12-03 15:23:02.699000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2008 |问题 70

本题是 ISRO CS 2008 的一道算法题,涉及到二叉树的建立和遍历。

问题描述

已知一棵二叉树的前序序列和中序序列,要求重建出这棵二叉树并对其进行后序遍历。

具体要求如下:

  • 函数原型:void postorder(int pre[], int in[], int n)
  • 输入参数:
    • pre:长度为 n 的一维数组,表示二叉树的前序遍历序列;
    • in:长度为 n 的一维数组,表示二叉树的中序遍历序列;
    • n:表示二叉树中节点的个数。
  • 输出参数:无
  • 要求在函数中输出二叉树的后序遍历序列,每个数字之间需要添加空格。
方法分析

根据二叉树遍历的规律,前序遍历的第一个元素为根节点,而中序遍历中根节点左边的所有元素属于左子树,右边的所有元素属于右子树。

因此,可以通过递归的方式,根据前序序列和中序序列重建二叉树,并对树进行后序遍历。

具体实现过程如下:

  1. 首先从前序序列中获取根节点。
  2. 然后在中序序列中找到根节点的位置,根节点左边的所有元素为左子树的中序序列,右边的所有元素为右子树的中序序列。
  3. 然后可以根据左子树的中序序列长度获取左子树的前序序列和右子树的前序序列。
  4. 递归重建左子树和右子树,并对其进行后序遍历。
  5. 最后输出当前节点的数值并在其后添加空格。
代码实现
void postorder(int pre[], int in[], int n) {

    if (n == 0) return;

    int root = pre[0];

    int i, j;
    for (i = 0; i < n; i++) {
        if (in[i] == root) break;
    }

    postorder(pre + 1, in, i); // 递归重建左子树
    postorder(pre + i + 1, in + i + 1, n - i - 1); // 递归重建右子树

    printf("%d ", root); // 输出当前节点的数值
}
参考链接