码迷,mamicode.com
首页 > 其他好文 > 详细

ACM 重建二叉树

时间:2015-06-06 22:02:36      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

重建二叉树

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
 
描述
题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!)。
 
输入
输入有多组数据(少于100组),以文件结尾结束。
每组数据仅一行,包括两个字符串,中间用空格隔开,分别表示二叉树的后序和中序序列(字符串长度小于26,输入数据保证合法)。
输出
每组输出数据单独占一行,输出对应得先序序列。
样例输入
ACBFGED ABCDEFG
CDAB CBAD
样例输出
DBACEGF
BCAD


这道题主要考查对二叉树的遍历的熟悉程度,对先序遍历,中序遍历,后序遍历的掌握程度;

由后序遍历可以得到,最后一个字母应该就是树的根节点,中序遍历是先访问左子树,后访问根节点,在访问右子树,然后通过中序遍历的序列,可以把这颗树分成左右子树,得出这颗树的结构,然后再递归得出先序遍历的序列

 

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

struct Node
{
    char value;
    Node* left;
    Node* right;
};

Node* buildNode(char value)
{
    Node* node = (Node*)malloc(sizeof(Node));
    node->value = value;
    node->left = node->right = NULL;
    return node;
}

Node* rebuildTree(char* post, char* in, int len)
{
    int i = 0;
    if(len == 0)
        return NULL;
    Node* head = buildNode(post[len-1]);
    for(i = 0; i < len; i++)
    {
        if(in[i] == post[len - 1])
            break;
    }
    head->left = rebuildTree(post, in, i);
    head->right = rebuildTree(post+i, in+i+1, len-i-1);
    return head;
}

void preorder(Node* head)
{
    if(head == NULL)
        return;
    printf("%c", head->value);
    preorder(head->left);
    preorder(head->right);
}

int main()
{
    char post[100], in[100];
    while(scanf("%s%s", post, in) != EOF)
    {
        preorder(rebuildTree(post, in, strlen(post)));
        printf("\n");
    }
    return 1;
}

 

ACM 重建二叉树

标签:

原文地址:http://www.cnblogs.com/sdlwlxf/p/4557344.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!