UVA122 Trees on the level

题目链接戳这里

题意

这里写图片描述

构造一个二叉树 然后用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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值