jyhlearning

导航

[NOIP2001 普及组] 求先序排列

[NOIP2001 普及组] 求先序排列

题目描述

给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数 $ \le 8$)。

输入格式

共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。

输出格式

共一行一个字符串,表示一棵二叉树的先序。

样例 #1

样例输入 #1

BADC
BDCA

样例输出 #1

ABCD

提示

【题目来源】

NOIP 2001 普及组第三题

思路

通过二叉树的基本建立方式解答,关于二叉树的特殊建立方式可以参考我的博客二叉树的特殊创建方式

解答1

#include <iostream>
#include <cstring>
using namespace std;
const int MAXN=10;
char in[MAXN],pos[MAXN];
int length;
struct node
{
    char ch;
    node* lchild;
    node* rchild;
};
node* CreateByInAndPos(int posL,int posR,int inL,int inR)//由后序和中序创建二叉树
{
    if(posL>posR||inL>inR)return NULL;
    node* root=new node;
    root->ch=pos[posR];
    int k;
    for(k=inL;k<=inR;k++)
        if(in[k]==pos[posR])break;
    int num=k-inL;
    root->lchild=CreateByInAndPos(posL,posL+num-1,inL,k-1);
    root->rchild=CreateByInAndPos(posL+num,posR-1,k+1,inR);
    return root;
}
void printByPre(node* root)
{
    if(root==NULL)return;
    cout<<root->ch;
    printByPre(root->lchild);
    printByPre(root->rchild);
}
int main()
{
    cin>>in>>pos;
    length=strlen(in);
    node* root=CreateByInAndPos(0,length-1,0,length-1);
    printByPre(root);
    return 0;
}

解答2

解答1是纯模拟,解答二选择直接在建立二叉树的过程中直接输出结果

#include <iostream>
#include <cstring>
using namespace std;
const int MAXN=10;
char in[MAXN],pos[MAXN];
void CreateByInAndPos(int posL,int posR,int inL,int inR)//由后序和中序创建二叉树
{
    if(posL>posR||inL>inR)return;
    cout<<pos[posR];
    int k;
    for(k=inL;k<=inR;k++)
        if(in[k]==pos[posR])break;
    int num=k-inL;
    CreateByInAndPos(posL,posL+num-1,inL,k-1);
    CreateByInAndPos(posL+num,posR-1,k+1,inR);
}
int main()
{
    cin>>in>>pos;
    int length=strlen(in);
    CreateByInAndPos(0,length-1,0,length-1);
    return 0;
}

posted on 2022-09-23 11:33  jyhlearning  阅读(83)  评论(0编辑  收藏  举报