您的位置:首页 > 理论基础 > 数据结构算法

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

2016-08-09 14:48 281 查看

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

Time Limit: 1000MS Memory limit: 65536K

题目描述

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

输入

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

输出

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

示例输入

2
abdegcf
dbgeafc
xnliu
lnixu


示例输出

dgebfca
abcdefg
linux
xnuli


提示

知道先序和中序求后序的方法。先序第一个为根,在中序中找到这个根,根左边是他的左子树,右边是右子树。依次递归

#include<stdio.h>

#include<iostream>

#include<stdlib.h>

#include<algorithm>

#include<string.h>

#include<queue>

using namespace std;

struct node

{

    char data;

    struct node *left;

    struct node *right;

};

struct node* create(char pre[],char in[],int n)

{

    struct node *root;

      //int p;

    root=new node;

    if(n==0) return NULL;

     root->data=pre[0];

    int m=strchr(in,pre[0])-in;                                //函数strchr(string s,char c);表示查找字符c在字符串 s 中的位置,并返回这个位置

                                                 //求左子树的结点的个数

    root->left=create(pre+1,in,m);      //递归求得左右子树,pre+1,越过头结点,从pre第二个开始找,in从第一个开始找,一共建立m个结点。

    root->right=create(pre+m+1,in+m+1,n-m-1);//pre+m+1越过头结点1和左子树的m,从pre+m+1开始,in 越过m个左子树的节点数和中间的根节点的个数,建立的 节点个数为总数减去左子树再减去1根节点

    return root;

}

void houxv(struct node *root)

{

    if(root)

    {

        houxv(root->left);

        houxv(root->right);

        cout<<root->data;

    }

}

void cengci(struct node *root)

{

    queue<node*>q;

    if(root)

        q.push(root);

        node *temp=new node;

    while(!q.empty())

    {

        temp=q.front(); q.pop();

        if(temp)

        {

            cout<<temp->data;

            q.push(temp->left);

            q.push(temp->right);

        }

    }

}

int main()

{

    char pre[1000],in[1000];

    int n;

    struct node*root;

    root=new node;

    cin>>n;

    //getchar();

    while(n--)

    {

        cin>>pre;

        cin>>in;

        int m=strlen(pre);

        root=create(pre,in,m);

        houxv(root);

        cout<<endl;

        cengci(root);

        cout<<endl;

    }

    return 0;

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: