• UVA-122(Trees on the level)


    Trees on the level

    题目链接:

    https://vjudge.net/problem/UVA-122

    题目意思:

    给你一些(,)让你建立一棵树,直到输入()结束建树,然后判断树是否完整,如果没有结点未赋值或者被赋值两次,就按层次遍历输出树,否则输出not complete

    代码:

    #include <algorithm>
    #include <malloc.h>
    #include <iostream>
    #include <string.h>
    #include <stdio.h>
    #include <queue>
    #include <stack>
    const int maxn=10010;
    using namespace std;
    typedef struct node
    {
        int data;
        struct node *lchild;
        struct node *rchild;
    };
     
    bool judge(node *b)
    {
        queue <node*> q;
        while(!q.empty()) q.pop();
        q.push(b);
        while(!q.empty())
        {
            node *u = q.front();
            q.pop();
            if(u->data < 0) return false;
            if(u->lchild != NULL)q.push(u->lchild);
            if(u->rchild != NULL)q.push(u->rchild);
        }
        return true;
    }
    void LevelOrder(node *b)
    {
        node *p;
        queue <node*> q;
        while(!q.empty())q.pop();
        q.push(b);
        while(!q.empty())
        {
            p = q.front();
            q.pop();
            if(p->data == b->data) printf("%d",p->data);
            else printf(" %d",p->data);
            if(p->lchild!=NULL) q.push(p->lchild);
            if(p->rchild!=NULL) q.push(p->rchild);
        }
        printf("
    ");
    }
    void Destroy(node *&b)
    {
        node *p;
        queue <node*> q;
        while(!q.empty())q.pop();
        q.push(b);
        while(!q.empty())
        {
            p = q.front();
            q.pop();
            if(p->lchild!=NULL) q.push(p->lchild);
            if(p->rchild!=NULL) q.push(p->rchild);
            free(p);
        }
    }
    int main()
    {
    //    freopen("in.txt","r",stdin);
    //    freopen("out.txt","w",stdout);
        node *root;
        root = (node *)malloc(sizeof(node));
        root->lchild = NULL;
        root->rchild = NULL;
        root->data = -1;
        char s[maxn],number[maxn];
        int i,flag=0;
        node *p,*b;
        while(scanf("%s",s)!=EOF)
        {
    //        printf("%s
    ",s);
            if(strcmp(s,"()")!=0)
            {
                int j=0;
                for(i=1; i<strlen(s); i++)
                {
                    if(s[i]==',')break;
                    number[j]=s[i];
                    j++;
                }
                number[j] = '';
                i++;
                p=root;
                while(1)
                {
                    if(s[i]==')')break;
                    else if(s[i]=='L')
                    {
                        if(p->lchild==NULL)
                        {
                            b = (node *)malloc(sizeof(node));
                            p->lchild = b;
                            b->data = -1;
                            b->lchild = NULL;
                            b->rchild = NULL;
                            p=b;
                        }
                        else
                            p = p->lchild;
                    }
                    else if(s[i]=='R')
                    {
                        if(p->rchild==NULL)
                        {
                            b = (node *)malloc(sizeof(node));
                            p->rchild = b;
                            b->data = -1;
                            b->lchild = NULL;
                            b->rchild = NULL;
                            p=b;
                        }
                        else
                            p = p->rchild;
                    }
                    i++;
                }
                if(p->data<0) p->data = atoi(number);
                else flag=1;
            }
            else
            {
                if(judge(root)&&flag!=1)
                {
                    LevelOrder(root);
                    Destroy(root);
                    root = (node *)malloc(sizeof(node));
                    root->lchild = NULL;
                    root->rchild = NULL;
                    root->data = -1;
                    flag=0;
                }
                else
                {
                    printf("not complete
    ");
                    Destroy(root);
                    root = (node *)malloc(sizeof(node));
                    root->lchild = NULL;
                    root->rchild = NULL;
                    root->data = -1;
                    flag=0;
                }
            }
        }
        return 0;
    }
    //节点未赋值  或者同一个节点赋值两次   就输出not complete 
  • 相关阅读:
    洛谷P1306 斐波那契公约数
    Codevs 1688 求逆序对(权值线段树)
    poj1006 Biorhythms
    2017-9-2 NOIP模拟赛
    洛谷P1633 二进制
    洛谷P2513 [HAOI2009]逆序对数列
    洛谷P2687 [USACO4.3]逢低吸纳Buy Low, Buy Lower
    洛谷P2285 [HNOI2004]打鼹鼠
    2017-8-31 NOIP模拟赛
    洛谷P2134 百日旅行
  • 原文地址:https://www.cnblogs.com/20172674xi/p/10017750.html
Copyright © 2020-2023  润新知