后序遍历

题目描述
有一棵二叉树,每个节点由一个大写字母标识(最多26个节点)。现有两组字母,分别表示前序遍历(父节点->左孩子->右孩子)和中序遍历(左孩子->父节点->右孩子)的结果,请你输出后序遍历(左孩子->右孩子->父节点)的结果。

输入
每个输入文件包含两串字母,各占一行。(每串只包含大写字母)
第一行字母表示前序遍历结果,第二行字母表示中序遍历结果。

输出
输出仅一行,表示后序遍历的结果,结尾换行。

样例
输入样例 1 复制

DBACEGF
ABCDEFG
输出样例 1

ACBFGED

/*
 * Create: 2019-8-20
 */

#include <stdio.h>
#include <string.h>

enum {
    ZERO = 0,
    ONE = 1,
    TWO,
    TWENTYSIX = 26,
    TWENTYSEEVN
};
#define ZEROCH '\0'

typedef struct TagTree {
    char ch;
    struct TagTree *left;
    struct TagTree *right;
} Tree;

Tree *TreeRoute(char *pre, char *middle, int len)
{
    if (len == ZERO) {
        return NULL;
    }
    Tree *head = (Tree *)malloc(sizeof(Tree));
    if (head == NULL) {
        return NULL;
    }
    int leftLen = ZERO;
    char ch = *pre;
    head->ch = ch;
    if (len == ONE) {
        head->left = NULL;
        head->right = NULL;
        return head;
    }

    for (; leftLen < len; ++leftLen) {
        if (ch == *(middle + leftLen)) {
            break;
        }
    }
    head->left = TreeRoute(pre + ONE, middle, leftLen);
    head->right = TreeRoute(pre + ONE + leftLen, middle + ONE + leftLen, len - ONE - leftLen);

    return head;
}

char g_post[TWENTYSEEVN];
char g_curr = 0;
void postRoute(Tree *head)
{
    if (head == NULL) {
        return;
    }
    if (head->left) {
        postRoute(head->left);
    }
    if (head->right) {
        postRoute(head->right);
    }
    g_post[g_curr] = head->ch;
    g_curr++;
    free(head);
    return;
}

int main()
{
    char pre[TWENTYSEEVN];
    char middle[TWENTYSEEVN];
    int res1 = scanf_s("%s", pre, TWENTYSEEVN);
    int res2 = scanf_s("%s", middle, TWENTYSEEVN);
    if (res1 != res2) {
        return -1;
    }
    int len = strlen(pre);
    Tree *head = TreeRoute(pre, middle, len);
    g_curr = 0;
    postRoute(head);
    g_post[len] = ZEROCH;
    printf("%s", g_post);

    return 0;
}
Java中的二叉树是一种常见的数据结构,它由一组节点组成。每个节点都包含一个大写字母标识最多可以有26节点二叉树的特点是每个节点最多有两个子节点一个是左子节点,另一个是右子节点。这些子节点可以为空,但不能超过两个。 在Java中,我们可以使用类来表示二叉树节点每个节点包含一个大写字母标识,以及指向左子节点和右子节点的引用。这些引用用来连接节点之间的关系。 对于二叉树的操作,我们可以使用递归的方式来实现。例如,如果要在二叉树中查找某个特定的节点,我们可以从根节点开始,逐级比较节点标识,如果找到了就返回该节点,否则继续在左子树和右子树中查找。 另一个常见的操作是插入节点。插入节点需要找到合适的位置,使得二叉树的结构仍然保持有序。一般来说,如果新节点标识小于当前节点标识,则将其插入到左子树中,否则将其插入到右子树中。 除了查找和插入,我们还可以对二叉树进行遍历。遍历可以分为前序遍历、中序遍历和后序遍历三种方式。前序遍历是先访问根节点,然后按照左子树和右子树的顺序递归遍历。中序遍历是按照左子树、根节点和右子树的顺序递归遍历。后序遍历是按照左子树、右子树和根节点的顺序递归遍历。 总之,Java中的二叉树是一种常见的数据结构,它由一组节点组成,每个节点都有一个大写字母标识最多可以有26节点。我们可以使用类来表示节点,并通过递归来实现二叉树的操作和遍历。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值