数据结构实验之求二叉树后序遍历和层次遍历

来源:互联网 发布:淘宝上发光闹钟说明书 编辑:程序博客网 时间:2024/06/17 12:35

数据结构实验之求二叉树后序遍历和层次遍历

Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic

Problem Description

 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历和层序遍历。

Input

 输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据。每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列。

Output

每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列。

Example Input

2abdegcfdbgeafcxnliulnixu

Example Output

dgebfcaabcdefglinuxxnuli

Hint

Author

ma6174

#include <bits/stdc++.h>using namespace std;struct Btree{    char data;    struct Btree *lc,*rc;};char pre[10010];//前序序列char mid[10010];//中序序列struct Btree* creat(int len, char *pre, char *mid)//二叉树的重建{    struct Btree *root;    int i ;    if(len == 0)    {        return NULL;    }    root = new Btree;    root -> data = pre[0];//找到根节点(前序遍历的第一位)    for(i = 0; i < len; i++)//在中序序列中找到根节点的位置    {        if(mid[i] == pre[0])            break;    }    root -> lc = creat(i, pre + 1, mid);//递归遍历(左子树的长度,左子树在pre中开始位置的地址,左子树在mid中开始位置的地址)    root -> rc = creat(len-i-1, pre+i+1, mid+i+1);//(右子树的长度,右子树在pre中开始位置的地址,右子树在mid中开始位置的地址)    return root;};void LRD(struct Btree *root)//后序遍历{    if(root)    {        LRD(root -> lc);        LRD(root -> rc);        cout<<root->data;    }}void cengxu(struct Btree * root)//以层序遍历的方式,寻找叶子节点{    queue<Btree*>q;    if(root)        q.push(root);    Btree *qq;    while(!q.empty())    {        qq = q.front();        q.pop();        if(qq -> lc)            q.push(qq->lc);        if(qq -> rc)            q.push(qq->rc);        cout<<qq->data;    }}int main(){    int n;    while(cin>>n)    {        while(n--)        {            cin>>pre>>mid;            int len = strlen(pre);            struct Btree *root;            root = creat(len,pre,mid);            LRD(root);            cout<<endl;            cengxu(root);            cout<<endl;        }    }    return 0;}


阅读全文
0 0