生活的烦恼 nsoj

来源:互联网 发布:《linux就该这么学 编辑:程序博客网 时间:2024/06/11 14:41

生活的烦恼

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
描述

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


输入
第一行输入一个数N,表示有N组测试数据。接下来N行,每行一个字符串,用'#'表示为空的节点,树的结束标志为'@'。'@'后仅有一个空格,空格后为一个数字,表示生活要输出的二叉树的第几层!
输出
每行输出一个字符串,表示给出二叉树的第n层!
样例输入
21 2 # # 3 # # @ 15 7 3 # # # 4 # # @ 3
样例输出
13
提示
5 第一层
/ \
7 4 第二层
/
3 第三层
来源
爱生活
上传者
TCM_张鹏


思路:题目容易理解,给你一行数字,按照前序遍历建立一个二叉树,#代表空格,数据正好的@前面可以建立好二叉树,我们需要在建立时标记层数(可以在树的结构体中加一个变量,用来表示层数),再写一个前序遍历函数,再函数中把要求的层数中的数输出来。

代码很简单。

#include <stdio.h>#include <string.h>#include <iostream>using namespace std;struct node{    char val[100];    int k;    node *left,*right;};node* build(int k){    node *p;    char s[100];    scanf("%s",s);    if(s[0]=='#')        p=NULL;    else    {        p=new node ;        strcpy(p->val,s);        p->k=k;        p->left= build(k+1);        p->right= build(k+1);    }    return p;}int k,flag;void dfs(node* p){    if(p)    {        if(p->k==k)        {            if(!flag)                printf("%s",p->val);            else printf("~%s",p->val);            flag=1;            return;        }        dfs(p->left);        dfs(p->right);    }}int main(){    int t;    scanf("%d",&t);    while(t--)    {        flag=0;        node *root=NULL;        char s[100];        root=build(1);        scanf("%s %d",s,&k);        dfs(root);        printf("\n");    }    return 0;}


原创粉丝点击