536 - Tree Recovery

给出二叉树的先序遍历和中序遍历,求后序遍历。
树中结点是不重复的大写字母,因此可以直接用其ASCII码作为数组下标来建树,维护每个结点的左孩子和右孩子数组。递归建树的过程比较常规,要注意递归结束的条件。

Problem.png
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;

string pre, in;
const int maxn = 256;
int lch[maxn], rch[maxn];

// 当前递归到的这棵树
// 先序下标范围 L1 --- R1
// 中序下标范围 L2 --- R2
int recov(int L1, int R1, int L2, int R2) {
    // 注意递归结束条件
    if (L1 > R1) return 0;
    int root = pre[L1];
    int i = L2;
    while (in[i] != root) i++;
    // 左子树中序 L2 --- i - 1
    // 右子树中序 i + 1 --- R2
    int l_n = i - L2;
    // 左子树先序 L1 + 1 --- L1 + l_n
    // 右子树先序 L1 + l_n + 1 --- R1
    lch[root] = recov(L1 + 1, L1 + l_n, L2, i - 1);
    rch[root] = recov(L1 + l_n + 1, R1, i + 1, R2);
    return root;
}

void post_order(int root) {
    // 注意递归结束条件
    if (root == 0) return;
    post_order(lch[root]);
    post_order(rch[root]);
    printf("%c", root);
}

int main() {
    while (cin >> pre >> in) {
        int len1 = pre.length(), len2 = in.length();
        int root = recov(0, len1 - 1, 0, len2 - 1);
        post_order(root);
        cout << endl;
    }
    return 0;
}

推荐阅读更多精彩内容

  • 第一章 绪论 什么是数据结构? 数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 第二章...
    SeanCheney阅读 1,721评论 0 17
  • 概念 树是什么 树(Tree)是n(n>=0)个结点的有限集。 n = 0的树是空树。 在任意一棵非空树中: 有且...
    刚刚悟道阅读 2,795评论 1 15
  • 1.树的定义 树是n(n>=0)个结点的有限集.n=0时称为空树.在任意一颗非空树种:(1)有且仅有一个特定的称为...
    蓝_上海求职阅读 900评论 1 13
  • 树和二叉树 1、树的定义 树(Tree)是由一个 或 多个结点 组成的有限集合T,且满足: ①有且仅有一个称为根的...
    利伊奥克儿阅读 206评论 0 0
  • 一、数据结构绪论 数据结构的基本概念 数据结构是一门研究非数值计算的程序设计问题中,计算机的操作对象以及它们之间的...
    龙猫小爷阅读 20,949评论 5 205