• 例题6-7 Trees on the level ,Uva122


    本题考查点有以下几个:

    1. 对数据输入的熟练掌握
    2. 二叉树的建立
    3. 二叉树的宽度优先遍历

    首先,特别提一下第一点,整个题目有相当一部分耗时在了第一个考查点上(虽然有些不必要,因为本应该有更简单的方法)。这道题的输入有以下几种方案:

    一次性输入并直接得到要得到的数据

    输入后进行加工处理

        对于第一种方案,我采用的是与正则相结合的方案

    scanf("(%d%[,A-Z]) ",&d,s))

    得到这样的写法可谓是费了一番功夫。难点有几个,最突出的是考虑数据不存在的情况:如()(1,)

    我的解决方案是对于(1,)读取后边字母时顺带读取 ‘,’这样能避免s为空读取混乱的情况006D538C

    对于()结束标记的判定,这就需要得到scanf的返回值,返回值为0,即代表读到了()。

    还有一点,要知道这道题目可是有多个结束标记,多组数据的,因此呢,

    while((k=scanf("(%d%[,A-Z]) ",&d,s))>=0)

    while执行的条件是>=0,注意必须包括0,再在循环中判断k==0,k=0即一组数据结束的标记,别忘再加上

    scanf("%*s ");

    其读取到的是“ )”,至于为啥没有前括号可能是之前已经读了%d之前的那部分括号。


         关于第二个考查点,建立二叉树可以用静态数组来储存节点,也可以动态建立节点。在这里只能用动态来建(数据打大了!)

       第三个考查宽度优先遍历,利用队列来完成这个操作。

    下面附上AC代码1

    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <queue>
    #include <iostream>
    using namespace std;
    struct Node{
        Node *left;
        Node *right;
        int value;
        Node():left(NULL),right(NULL){}
    };
    Node * root;
    Node* newnode(){
        Node * t=new Node();
        t->value=0;
        return t;
    }
    int AddNode(int n, char *s){
        int len = strlen(s);
        Node* node=root;
        for(int i=0;i<len;i++){
            if(s[i] == 'L'){
                if(node->left == NULL){node->left = newnode();}
                node = node ->left;
            }
            else if(s[i] == 'R'){
                if(node->right == NULL)node->right = newnode();
                node = node ->right;
            }
        }
        if(!node->value){node->value=n;return 1;}
        else return 0;
    }

    bool bfs(vector<int>& ans){
        queue<Node*> q;
        ans.clear();
        q.push(root);
        while(!q.empty()){
            Node* u = q.front(); q.pop();
            if(!u->value)return false;
            ans.push_back(u->value);
            if(u->left != NULL)q.push(u->left);
            if(u->right != NULL)q.push(u->right);
        }
        return true;
    }
    void remove_tree(Node* u){
        if(u == NULL) return ;
        remove_tree(u->left);
        remove_tree(u->right);
        delete u;
    }
    int main(){
        #ifdef DEBUG
        freopen("6.7.in","r",stdin);
        freopen("6.7.out","w",stdout);   
        #endif
        root=newnode();
        int d=-1;
        int ok=1;
        int k;
        char s[10]={0};
        while((k=scanf("(%d%[,A-Z]) ",&d,s))>=0){
            if(k==0){
                if(ok) {
                    vector<int> ans;
                    if(bfs(ans)){
                        int first=1;
                        for(vector<int>::iterator it = ans.begin(); it != ans.end(); ++it){
                            if(!first)printf(" ");
                            else first=0;
                            cout << *it ;
                         }
                         printf(" ");

                    }
                    else ok=0;
                }
                if(!ok)printf("not complete ");
                ok=1;
                remove_tree(root);
                root=newnode();
                scanf("%*s ");
                continue;
            }
          // printf("(%d%s) %d",d,s,k);
            if(!ok)continue;
            if(!AddNode(d,&s[1]))ok=0;
        }


        return 0;
    }

  • 相关阅读:
    Linux编程之epoll
    Linux IO模式及 select、poll、epoll详解
    与程序员相关的CPU缓存知识
    JDK源码阅读-FileOutputStream
    JDK源码阅读-FileInputStream
    JDK源码阅读-ByteBuffer
    Java如何保证文件落盘?
    Linux/UNIX编程如何保证文件落盘
    JDK源码阅读-RandomAccessFile
    JDK源码阅读-FileDescriptor
  • 原文地址:https://www.cnblogs.com/Wade-/p/5751051.html
Copyright © 2020-2023  润新知