认识二叉树之模拟二叉树【紫书例题 uva-122】

题目链接 Trees on the level【UVA - 122】


  算得上是模拟吧,除了输入,大致都是二叉树的基本知识点了。

题意:给出一段字符串,每个都是这样的输入"(int, char * )"类型的表示插入的值以及插入的位置,只有“L”、“R”表明是插入在左子树还是在右子树,输入到“EOF”结束。然后是查询,如果是隔断树,也就是中间有结点断点了,那么就是不行的,输出“not complete”,如果可行,那么一排一排的输出,每一排从左到右。

  这是一道认识二叉树的好题了。

  首先,对于一棵二叉树,有左右结点,巴拉巴拉……(这里就不讲了,软件技术基础啦……)

  然后,我这里使用的是静态开点,跟很多有指针来写的不一样吧。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <unordered_map>
//#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f3f3f3f3f
#define eps 1e-8
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
#define MP(a, b) make_pair(a, b)
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 300;
struct node
{
    bool used;
    int val, lc, rc;
    node(bool _u = false, int _v=0, int _l=0, int _r=0):used(_u), val(_v), lc(_l), rc(_r) {}
} a[maxN];
int root = 0, tot = 0;
bool flag;
inline void Insert(int rt, int val, char *s)
{
    int len = (int)strlen(s);
    if(!root) { root = ++tot; rt = tot; a[tot] = node(); }
    for(int i=0; i<len; i++)
    {
        if(s[i] == 'L')
        {
            if(!a[rt].lc)
            {
                a[rt].lc = ++tot;
                a[tot] = node();
            }
            rt = a[rt].lc;
        }
        else
        {
            if(!a[rt].rc)
            {
                a[rt].rc = ++tot;
                a[tot] = node();
            }
            rt = a[rt].rc;
        }
    }
    if(a[rt].used) flag = false;
    a[rt].used = true; a[rt].val = val;
}
queue<int> Q;
vector<int> ans;
void bfs()
{
    while(!Q.empty()) Q.pop();
    ans.clear();
    Q.push(root);
    int u;
    while(!Q.empty())
    {
        u = Q.front(); Q.pop();
        if(a[u].lc) Q.push(a[u].lc);
        if(a[u].rc) Q.push(a[u].rc);
        if(!a[u].used) flag = false;
        ans.push_back(a[u].val);
    }
    if(!flag) printf("not complete\n");
    else
    {
        int len = (int)ans.size();
        for(int i=0; i<len; i++) printf("%d%c", ans[i], i == len - 1 ? '\n' : ' ');
    }
}
char ch[40005], work[maxN];
int main()
{
    while(scanf("%s", ch) != EOF)
    {
        root = 0; flag = true;
        int len = (int)strlen(ch);
        bool dou = false;
        for(int i=0, lsz, val; i<len;)
        {
            if(ch[i] ^ '(') { i++; continue; }
            i++;
            lsz = val = 0; dou = false;
            while(ch[i] ^ ')')
            {
                if(ch[i] == ',') { i ++; dou = true; continue; }
                if(!dou)
                {
                    val = val * 10 + ch[i] - '0';
                }
                else
                {
                    work[lsz ++] = ch[i];
                }
                i++;
            }
            i++;
            work[lsz] = '\0';
            Insert(root, val, work);
        }
        if(ch[len - 1] == ')' && ch[len - 2] == '(') continue;
        while(true)
        {
            scanf("%s", ch);
            len = (int)strlen(ch);
            for(int i=0, lsz, val; i<len;)
            {
                if(ch[i] ^ '(') { i++; continue; }
                i++;
                lsz = val = 0; dou = false;
                while(ch[i] ^ ')')
                {
                    if(ch[i] == ',') { i ++; dou = true; continue; }
                    if(!dou)
                    {
                        val = val * 10 + ch[i] - '0';
                    }
                    else
                    {
                        work[lsz ++] = ch[i];
                    }
                    i++;
                }
                i++;
                work[lsz] = '\0';
                if(dou) Insert(root, val, work);
            }
            if(ch[len - 1] == ')' && ch[len - 2] == '(') break;
        }
        bfs();
    }
    return 0;
}
发布了887 篇原创文章 · 获赞 1060 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_41730082/article/details/105279791