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

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

Time Limit: 1000MS Memory Limit: 65536KB
Problem Description

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

Input

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

Output

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

Example Input
2
abdegcf
dbgeafc
xnliu
lnixu
Example Output
dgebfca
abcdefg
linux
xnuli

Hint

注释写的很清楚,准备开始慢慢啃数据结构


#include <bits/stdc++.h>

using namespace std;

string a,b;

struct node
{
    char data;

    node* lchild;
    node* rchild;
};

node* create(int l1,int r1,int l2,int r2)
{
    if(l1>r1) return NULL; //先序遍历反复向右方移动以此来寻找根节点,当左边的大于右边时,停止遍历

    node* root=new node;

    root->data=a[l1];//获取先序排列的根节点

    int record;

    for(int i=l2;i<=r2;i++)
    {
        if(b[i]==a[l1])
        {
            record=i;
            break;
        }
    }

    int numleft=record-l2;//通过中序遍历确定左树的数目

    root->lchild=create(l1+1,l1+numleft,l2,record-1);//先序遍历只是负责提供根节点的,中序遍历负责区分左右树,然后把中序遍历确定的区间范围加到先序遍历上,完成dfs建树。
    root->rchild=create(l1+numleft+1,r1,record+1,r2);

    return root;
}

void houxu(node* root)
{
   if(root->lchild!=NULL)  houxu(root->lchild);
   if(root->rchild!=NULL)  houxu(root->rchild);
   cout<<root->data;
}


void bfs(node* root)
{
    queue<node*> q;

    q.push(root);

    while(!q.empty())
    {
        node* now=q.front();

        q.pop();

        cout<<now->data;

       if(now->lchild!=NULL) q.push(now->lchild);
       if(now->rchild!=NULL) q.push(now->rchild);
    }
}


int main()
{
    int n;
    cin>>n;
    getchar();

    while(n--)
    {
        getline(cin,a);
        getline(cin,b);

        node* root=create(0,a.length()-1,0,b.length()-1);

        houxu(root);
        cout<<endl;

        bfs(root);
        cout<<endl;

    }

    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值