二叉树遍历序列还原

给出二叉树的中序遍历序列和后序遍历序列,编程还原该二叉树。

输入:
  第1行为二叉树的中序遍历序列
  第2行为二叉树的后序遍历序列

输出:
  二叉树的按层遍历序列

测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. badcfeg↵
  2. bdfgeca↵
以文本方式显示
  1. abcdefg↵
1秒64M0
测试用例 2以文本方式显示
  1. cbdafeg↵
  2. cbdfgea↵
以文本方式显示
  1. adebfgc↵
1秒64M0
测试用例 3以文本方式显示
  1. edcba↵
  2. edcba↵
以文本方式显示
  1. abcde↵
1秒64M0

代码如下: 

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

typedef struct TreeNode
{
    char data;
    struct TreeNode *lchild;
    struct TreeNode *rchild;
    struct TreeNode *next;
} BiNode, *BiTree;
BiTree CreateTree(char *iorder, char *porder, int L_border, int R_border, int p, int q)
{
    char proot = porder[q];
    int iroot_postion, rootflag = 0;
    for (int i = L_border; i <= R_border; i++)
    {
        if (iorder[i] == proot)
        {
            iroot_postion = i;
            rootflag = 1;
            break;
        }
    }
    if (rootflag == 0)
        return NULL;
    else
    {
        BiTree root = (BiTree)malloc(sizeof(BiNode));
        root->data = iorder[iroot_postion];
        if (iroot_postion == L_border && iroot_postion == R_border)
        {
            root->lchild = NULL;
            root->rchild = NULL;
        }
        else if (iroot_postion == L_border)
        {
            root->lchild = NULL;
            root->rchild = CreateTree(iorder, porder, L_border + 1, R_border, p, q - 1);
        }
        else if (iroot_postion == R_border)
        {
            root->rchild = NULL;
            root->lchild = CreateTree(iorder, porder, L_border, R_border - 1, p, q - 1);
        }
        else
        {
            root->lchild = CreateTree(iorder, porder, L_border, iroot_postion - 1, p, p + iroot_postion - L_border - 1);
            root->rchild = CreateTree(iorder, porder, iroot_postion + 1, R_border, p + iroot_postion - L_border, q - 1);
        }
        return root;
    }
}
void PrintTree(BiTree root)
{
    if (root == NULL)
        return;
    BiTree *queue = (BiTree *)malloc(sizeof(BiTree));
    int front = -1, rear = -1;
    queue[++rear] = root;
    while (front != rear)
    {
        BiTree temp = queue[++front];
        putchar(temp->data);
        if (temp->lchild)
            queue[++rear] = temp->lchild;
        if (temp->rchild)
            queue[++rear] = temp->rchild;
    }
}
int main()
{
    char iorder[100], porder[100];
    scanf("%s", iorder);
    scanf("%s", porder);
    int n = strlen(iorder);
    BiTree root = CreateTree(iorder, porder, 0, n - 1, 0, n - 1);
    PrintTree(root);
    putchar('\n');
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值