您的位置:首页 > 其它

NYOJ1063_生活的烦恼

2016-07-06 10:40 316 查看
描述

生活的暑假刚集训开始,他要决心学好字典树,二叉树,线段树和各种树,但生活在OJ上刷题的时候就遇到了一个特别烦恼的问题。那当然就是他最喜欢的二二叉树咯!题目是这样的:给你一颗非空的二叉树,然后再给你一个整数n,让生活输出这颗二叉树的第n(n>0且n<=树的深度)层,出题者为了给生活降低难度,要求两个输出数据之间用'~'隔开。看来我们的出题人很有爱啊!



输入第一行输入一个数N,表示有N组测试数据。接下来N行,每行一个字符串,用'#'表示为空的节点,树的结束标志为'@'。'@'后仅有一个空格,空格后为一个数字,表示生活要输出的二叉树的第几层!
输出每行输出一个字符串,表示给出二叉树的第n层!
样例输入
2
1 2 # # 3 # # @ 1
5 7 3 # # # 4 # # @ 3


样例输出
1
3


题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=1063

在这里我重述下题目,因为这个作者说的有点不清楚。
输入数据为二叉树的先序遍历顺序,其中#空结点的标志。@为树的结束标志(多此一举,给定了树的序列,一定是到此正好建立完毕。。@后的一个数学为要输入二叉树的第几层。。二叉树的层数从1开始计数)
输出的要求,输入这棵二叉的第n层的结点。如果结点的数据 大于1,则应该每二个结点之间用'~'分开
另外我想说的本题的坑:是本题的树的结点编号不一定是数字,但是一定是一个字符。但是我这里使用了字符串统一处理,使程序的鲁棒性更强。

其实本题考的就是二叉的重建与层次遍历(指定层次的)。。树的重建数据结构课本上有。。指定层次的层次遍历只需使用一个变量记录当前层次即可。
代码:

#include<cstdlib>

#include<string>

#include<iostream>

#include<cmath>

#include<cstring>

#include<algorithm>

#include<iomanip>

#include<ctime>

#include<cstdio>

#include<stack>

#include<map>

#include<queue>

#include<vector>

using namespace std;

typedef struct BiNode

{

    string data;

    struct BiNode *lchild,*rchild;

}BiTNode,*BiTree;

void  createBiTree(BiTree &r)

{

    string temp;

    cin>>temp;

    if(temp.length()==1 && temp[0]=='#')

        r=NULL;

    else

    {

        r = new BiTNode;

        r->data = temp;

        createBiTree(r->lchild );

        createBiTree(r->rchild );

    }    

}

queue<string>ans;

void preOrder(BiTree &r,int curLever,int lever)

{

    if(r==NULL)

        return;

    if(lever==curLever)

    {

        ans.push(r->data);

        return;

    }

    preOrder(r->lchild ,curLever+1,lever);

    preOrder(r->rchild ,curLever+1,lever);

}

int main()

{

    int n;

    cin>>n;

    while(n--)

    {

        string cc;

        BiTree T;

        int lever;

        createBiTree(T);

        cin>>cc;

        cin>>lever;

        preOrder(T,1,lever);

        int len=ans.size();

        if(len>1)

        {

            for(int i=0;i<len-1;i++)

            {

                cout<<ans.front()<<'~';

                ans.pop();

            }

        }

        cout<<ans.front()<<endl ;

        ans.pop();

    }        

    return 0;

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