Vijos 1132 求二叉树的先序序列

描述

给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度≤8)。

格式

输入格式

第一行为二叉树的中序序列
第二行为二叉树的后序序列

输出格式

一行,为二叉树的先序序列

样例1

样例输入1

BADC
BDCA

样例输出1

ABCD

限制

每个测试点1s

来源

noip2001普及组第三题
<br/ >
<br/ >
解析:根据中序序列和后续序列构造出这棵二叉树,再先序遍历即可。

#include <iostream>
#include <string>
using namespace std;

string s1, s2;

struct Node{
    char val;
    Node *l , *r;
    Node(){
        l = NULL;
        r = NULL;
    }
};

Node* build(const string& s1, const string& s2)
{
    Node *root = new Node();
    root->val = *(s2.end()-1);
    size_t pos = s1.find(root->val);
    if(pos != 0){
        string left_s1 = s1.substr(0, pos);
        string left_s2 = s2.substr(0, pos);
        root->l = build(left_s1, left_s2);
    }
    if(pos != s1.length()-1){
        string right_s1 = s1.substr(pos+1);
        string right_s2 = s2.substr(pos, s2.length()-1-pos);
        root->r = build(right_s1, right_s2);
    }
    return root;
}

void pre_order(Node *root)
{
    if(root != NULL){
        cout<<root->val;
        pre_order(root->l);
        pre_order(root->r);
    }
}

void destroy(Node *root)
{
    if(root->l != NULL)
        destroy(root->l);
    if(root->r != NULL)
        destroy(root->r);
    delete root;
}

int main()
{
    cin>>s1>>s2;
    Node *root = build(s1, s2);
    pre_order(root);
    destroy(root);
    return 0;
}

posted on 2016-10-12 21:14  月夜下  阅读(191)  评论(0编辑  收藏  举报

导航

"320px">