pat L2-006树的遍历

L2-006. 树的遍历

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N(<=30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2

        这个题可以有好几种解法:就本人水平,目前只会通过数组来实现,这个方法比较浪费空间数据大了就不适用。

    首先对于二叉树要了解,前序,中序,后序,层序的概念;

    1.前序:先根节点,后左子树,最后右子树;

    2.中序:先左子树,后根节点,最后右子树;

    3.后序:先左子树,后右子树,最后根节点;

    4.层序:从上到下一层一层;

    使用数组来求需要知道对于二叉树来说:左子树的坐标是2*index+1

对于右子树坐标是2*index+2;

    所以使用递归查找更节点,存储在数组中,最后由于有一些数组的值不是题目要求的,所以有个去0的过程。

    在递归的过程中最重要的是判断每次左子树与右子树的范围;在这错了好长时间;

    代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
const int maxn=10000;
using namespace std;

int s1[maxn],s2[maxn];
int s3[maxn];
void judge(int p1,int p2,int q1,int q2,int index)
{
    if(p1>p2||q1>q2)
    {
        return ;
    }
    int i;
    for(i=0;s1[q2]!=s2[p1+i];i++);
    s3[index]=s1[q2];
    //cout<<index<<" ";
//最开始就错在这里judge(p1,i-1,qi,q1+i-1,2*index+1)在输出时会出现未知错误。
     judge(p1,p1+i-1,q1,q1+i-1,2*index+1);
    judge(p1+i+1,p2,q1+i,q2-1,2*index+2);
}

int main()
{
    int n;

    while(cin>>n)
    {
        for(int i=0;i<n;i++)
            cin>>s1[i];
        for(int i=0;i<n;i++)
            cin>>s2[i];
        memset(s3,0,sizeof(s3));
        judge(0,n-1,0,n-1,0);
        int cnt=0;
        for(int i=0;i<100000;i++)
        {
            if(cnt==n)break;
            if(s3[i])
            {
                cnt++;
                if(i)
                {
                   cout<<" ";
                }
                cout<<s3[i];
            }
        }
    }

    return 0;
}


    



猜你喜欢

转载自blog.csdn.net/ab1605014317/article/details/79511033