UVA122 Trees on the level

原创 2016年08月28日 22:40:40

题目链接戳这里

题意

这里写图片描述

构造一个二叉树 然后用bfs层次遍历二叉树
用到sscanf()函数处理字符串
画画图模拟一下很好明白的

用指针写的

/*  UVA 122
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <cmath>
#include <stack>
#include <string>
#include <map>
#include <set>
#define pi acos(-1.0)
#define LL long long
#define ULL unsigned long long
#define inf 0x3f3f3f3f
#define INF 1e18
//#define lson l,mid,rt<<1
//#define rson mid+1,r,rt<<1|1
#define debug(a) printf("---%d---\n", a);
#define mem0(a) memset(a, 0, sizeof(a))
#define memi(a) memset(a, inf, sizeof(a))
#define mem1(a) memset(a, -1, sizeof(a))
using namespace std;
typedef pair<int, int> P;
const double eps = 1e-10;
const int maxn = 1e6 + 5;
const int mod = 1e8;

int failed, node;
struct Node{
    int val, flag;
    Node* lson;
    Node* rson;
}tree[maxn]; 
Node* NewNode(){
    Node* p = &tree[node++];
    p->flag = p->val = 0;
    p->lson = p->rson = NULL;
    return p;
}
void addnode(Node* root, int v, char* s){
    Node* p = root;
    for (int i = 0; i < strlen(s); i++){ // 从根节点往下走 
        if (s[i] == 'L'){
            if (p->lson == NULL) p->lson = NewNode(); // 结点不存在,建立新结点 
            p = p->lson;   // 往左走 
        }
        else if (s[i] == 'R'){
            if (p->rson == NULL) p->rson = NewNode();
            p = p->rson;        
        }
    }
    if (p->flag) failed = 1; // 若此结点已经被赋值 failed 
    p->val = v;
    p->flag = 1;
} 
void bfs(Node* root, vector<int>* ans)
{
    queue<Node*> q;
    q.push(root);
    while (!q.empty()){
        Node* p = q.front(); q.pop();
        if (p->flag == 0){
            failed = 1;
        }
        (*ans).push_back(p->val);
        if (p->lson != NULL) q.push(p->lson);
        if (p->rson != NULL) q.push(p->rson);
    }
}
int main(void)
{
//  freopen("C:\\Users\\wave\\Desktop\\NULL.exe\\NULL\\in.txt","r", stdin);
    char s[35], str[35];
    int v, i;
    while (~scanf("%s", s))
    {
        failed = node = 0;
        Node* root = NewNode();  // 根节点 
        if (strcmp(s, "()") != 0){
            sscanf(s, "(%d,%s", &v, str); // 一种写法 
            addnode(root, v, str);
        }else continue;
        while (~scanf("%s", s)){
            if (strcmp(s, "()") == 0) break;
            sscanf(&s[1], "%d", &v); // 另一种写法 
            addnode(root, v, strchr(s, ',')+1);
        }
        vector<int> ans;
        if (!failed) bfs(root, &ans);
        if (failed) puts("not complete");
        else {
            for (i = 0; i < ans.size(); i++)
                printf("%d%c", ans[i], i+1==ans.size()?'\n':' ');   
        }
    }   
    return 0;
}

不用指针写的

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <cmath>
#include <stack>
#include <string>
#include <map>
#include <set>
#define pi acos(-1.0)
#define LL long long
#define ULL unsigned long long
#define inf 0x3f3f3f3f
#define INF 1e18
//#define lson l,mid,rt<<1
//#define rson mid+1,r,rt<<1|1
#define debug(a) printf("---%d---\n", a)
#define mem0(a) memset(a, 0, sizeof(a))
#define memi(a) memset(a, inf, sizeof(a))
#define mem1(a) memset(a, -1, sizeof(a))
using namespace std;
typedef pair<int, int> P;
const double eps = 1e-10;
const int maxn = 1e6 + 5;
const int mod = 1e8;

int failed, node;
struct Node{
    int val, flag;
    int lson, rson;
}tree[maxn];
int NewNode(){
    tree[++node].val = 0;
    tree[node].flag = 0;
    tree[node].lson = 0;
    tree[node].rson = 0;
    return node;
}
void addnode(int rt, int v, char* s){
    for (int i = 0; i < strlen(s); i++){
        if (s[i] == 'L'){
            if (!tree[rt].lson)
                tree[rt].lson = NewNode();
            rt = tree[rt].lson;
        }
        else if (s[i] == 'R'){
            if (!tree[rt].rson)
                tree[rt].rson = NewNode();
            rt = tree[rt].rson;
        }
    }
    if (tree[rt].flag) failed = 1;
    tree[rt].val = v;
    tree[rt].flag = 1;
}
vector<int> bfs(int rt){
    queue<int> q;
    q.push(rt);
    vector<int> ans;
    while (!q.empty()){
        int u = q.front(); q.pop();
        if (tree[u].flag == 0){
            failed = 1;
            break;
        }
        ans.push_back(tree[u].val);
        if (tree[u].lson) q.push(tree[u].lson);
        if (tree[u].rson) q.push(tree[u].rson);
    }
    return ans;
}
int main(void)
{
//  freopen("C:\\Users\\wave\\Desktop\\NULL.exe\\NULL\\in.txt","r", stdin);
    char s[35], str[35];
    int v, i;
    while (~scanf("%s", s))
    {
        failed = node = 0;
        int root = NewNode();    // 根节点 
        if (strcmp(s, "()") != 0){
            sscanf(s, "(%d,%s", &v, str); // 一种写法 
            addnode(root, v, str);
        }else continue;
        while (~scanf("%s", s)){
            if (strcmp(s, "()") == 0) break;
            sscanf(&s[1], "%d", &v); // 另一种写法 
            addnode(root, v, strchr(s, ',')+1);
        }
        vector<int> ans;
        if (!failed) ans = bfs(root);
        if (failed) puts("not complete");
        else {
            for (i = 0; i < ans.size(); i++)
                printf("%d%c", ans[i], i+1==ans.size()?'\n':' ');   
        }
    }   
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

[UVA122]Trees on the level

以任意顺序给出一棵二叉树的节点,格式如: (5,LLRL), 数字表示该节点的值. 要求输出一棵树中从一个叶子走到根节点的取到最小权值和的那个叶子节点,假如有多个叶子节点能取到最小的权值,则输出叶子...
  • lxz19971204
  • lxz19971204
  • 2017年03月31日 20:08
  • 193

uva122 trees on the level

看不下去,找点简单的,再回来写
  • a197p
  • a197p
  • 2015年01月31日 23:17
  • 344

UVA122 - Trees on the level

尽量用的STL,运行效率有很大缺失,不过更容易理解,读者自行写C语言格式吧。#include #include #include #include #include #include using na...
  • RonggeRace
  • RonggeRace
  • 2015年03月03日 00:34
  • 203

UVa122 Trees on the level

题意:输入一个二叉树,然后层次遍历输出。如果树是不完整的或一个节点被赋值多次,输出 not complete 。 思路:BFS。其实做这道题是为了试用数组来存动态树型结构的。...
  • squee_spoon
  • squee_spoon
  • 2014年09月02日 19:38
  • 311

UVA122 trees on the level(BFS)

写了n遍总算是写对了,不能停止地相信自己。#include #include #include #include using namespace std; const int maxn = 300; ...
  • a197p
  • a197p
  • 2015年02月06日 08:49
  • 240

UVa122:Trees on the level

题目描述建立节点,并使用BFS输出。代码实现#define _CRT_SECURE_NO_WARNINGS#include #include #define maxn 256using namesp...
  • c602273091
  • c602273091
  • 2017年02月24日 01:07
  • 549

UVA122 Trees on the level【二叉树】【BFS】

题目大意:输入一颗二叉树,将它按从上到下、从左到右的顺序输出各个节点位置。 思路:先根据输入的字符串将二叉树建立起来(注:可能出现不能建立的情况),若能 成功建立,则用宽度优先搜索(BFS)的方法遍历...
  • u011676797
  • u011676797
  • 2014年12月11日 09:23
  • 1218

UVA122 Trees on the level(二叉树建立与遍历)

题目链接:Trees on the level题目大意:按题目要求建立二叉树,层次遍历即可。 输入格式为: (11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL)...
  • ACM_Fish
  • ACM_Fish
  • 2016年12月08日 21:36
  • 219

Trees on the level(UVA122,二叉树的建立)

Background Trees are fundamental in many branches of computer science. Current state-of-the art p...
  • longshanxiaoxuesheng
  • longshanxiaoxuesheng
  • 2016年03月22日 17:30
  • 145

Uva122 Trees on the level 二叉树的数组实现

作为一个还没有系统学习数据结构知识的大一学生,简单谈一下通过这道题对二叉树产生的认识。       二叉树的一个节点中起码包含三个基础信息:节点权值、左子节点的地址(或编号)、右子节点的地址(或编号...
  • jijijix
  • jijijix
  • 2016年08月12日 18:11
  • 214
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVA122 Trees on the level
举报原因:
原因补充:

(最多只允许输入30个字)