zoukankan      html  css  js  c++  java
  • 18.11.13 二叉树三则

    二叉树的深度(10分)

    题目内容:

    给定一棵二叉树,求该二叉树的深度

    二叉树深度定义:从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的节点个数为树的深度

    输入格式:

    第一行是一个整数n,表示二叉树的结点个数。二叉树结点编号从1到n,根结点为1,n <= 10

    接下来有n行,依次对应二叉树的n个节点。

    每行有两个整数,分别表示该节点的左儿子和右儿子的节点编号。如果第一个(第二个)数为-1则表示没有左(右)儿子

    输出格式:

    输出一个整型数,表示树的深度

    输入样例:

    3
    2 3
    -1 -1
    -1 -1

    输出样例:

    2
     1 #include <iostream>
     2 #include <string.h>
     3 #include <algorithm>
     4 #include <stack>
     5 #include <string>
     6 #include <math.h>
     7 #include <queue>
     8 #include <stdio.h>
     9 #include <string.h>
    10 #include <vector>
    11 #include <fstream>
    12 #include <set>
    13 #define  inf 999999;
    14 
    15 using namespace std;
    16 int n;
    17 struct treenode {
    18     int left, right;
    19     treenode() {
    20         left = -1, right = -1;
    21     }
    22 }tree[11];
    23 
    24 int depth(int i)
    25 {
    26     if (i == -1)return 0;
    27     int left, right;
    28     left = depth(tree[i].left);
    29     right = depth(tree[i].right);
    30     return max(left, right)+1;
    31 }
    32 int main()
    33 {
    34     scanf("%d", &n);
    35     for (int i = 1; i <= n; i++) {
    36         int x, y;
    37         scanf("%d%d", &x, &y);
    38         tree[i].left = x, tree[i].right = y;
    39     }
    40     printf("%d
    ", depth(1));
    41     return 0;
    42 }
    View Code

    物质分解记录(10分)

    题目内容:

    对 物质分解记录 的结构进行统计分析。
    例如:
    给出一份 物质分解记录。
    Material_1
    {
    Material_2
    {
    Material_3
                    Material_4
    Material_5
                    {
                    Material_6
                    Material_7
                    }
                    Material_8
    }
    Material_9
    Material_10
    }
    Material_11
    {
    Material_l3
    Material_7
    Material_2
    {
    Material_3
                    Material_4
    Material_5
                    {
                 Material_6
                 Material_7
                    }
                    Material_8
    }
    Material_13
    }

    上述记录的含义是,Material_1分解为 Material_2、Material_9和Material_10,Material_2又分解为Material_3、Material_4、Material_5和Material_8。以此类推,大括号外书写特定物质名称,括号内表示此特定物质分解出来的子物质名称,每个子物质还可再分解。

    现输入一个物质名称R,要求输出所有和物质R在记录中属于同一层次且位置在R之后的物质名称。
    比如R=“Material_1” ,则应该输出“Material_11”;
    比如R=“Material_9” ,则应该输出“Material_10”
    如果R在代码中出现了多次,则以其第一次出现为准,即仅输出与第一次出现的R属于同一层次且位置在R之后的语句内容。
    比如R=“Material_2” ,则应该输出
            Material_9
    Material_10

     

     

    输入格式:

    输入包含多组数据。第一行是物质分解记录的份数,仅用一个整数表示。从第二行开始,每组数据包括 物质分解记录 和 所需查找的物质R 两部分,物质分解记录样式如描述中所示,R的内容和物质分解记录之间有一行空行,下一份记录与上一个R之间有两行空行。
    若输入!则表示输入结束。
    为简单起见,物质分解记录中每一行的内容为“{”或者“}”或者一个物质名称,不会有其他情况(比如空行)出现。同时每行文字前不会有任何缩进。物质名称是英文字母、数字和下划线组成的字符串。

     

    输出格式:

    对每组数据输出一行,如果R在记录中找到,则输出所有与R在同一层次且位置在R之后的物质名称,名称之间无需添加空格,紧密连接即可;否则输出No。若R是其所在层次中最后一个物质,则输出"",即输出一个空字符。

     

    输入样例:

    3
    Material_1
    {
    Material_2
    {
    Material_3
    Material_4
    Material_5
    {
    Material_6
    Material_7
    }
    Material_8
    }
    Material_9
    Material_10
    }
    
    Material_2
    
    
    Material_1
    {
    Material_2
    {
    Material_3
    Material_4
    Material_5
    {
    Material_6
    Material_7
    }
    Material_8
    }
    Material_9
    Material_10
    }
    Material_11
    {
    Material_3
    Material_7
    Material_2
    {
    Material_3
    Material_4
    Material_5
    {
    Material_6
    Material_7
    }
    Material_8
    }
    Material_13
    }
    
    Material_2
    
    
    Material_1
    {
    Material_2
    {
    Material_3
    Material_4
    Material_5
    {
    Material_6
    Material_7
    }
    Material_8
    }
    Material_9
    Material_10
    }
    
    Material_20
    
    
    !

     

    输出样例:

    Material_9Material_10
    Material_9Material_10
    No

    提示:

    读入数据时,需采用如下方式进行读取。
    例:若要读取一行输入内容,则
    cin.getline(line, lineSize, ' ');
    sscanf(line, "%s", tmp);

    其中line和tmp为数组指针,类型为char* ,linesize为line所指向的数组的规模,为int型。
    所需读取的内容最终是存储在tmp数组中。之后如需对读取的内容进行操作,就对tmp进行操作即可,读到空行时tmp长度即为0。

    采用其他方法读取可能会出现WA以及RE,TLE。

      1 #include <iostream>
      2 #include <string.h>
      3 #include <algorithm>
      4 #include <stack>
      5 #include <string>
      6 #include <math.h>
      7 #include <queue>
      8 #include <stdio.h>
      9 #include <string.h>
     10 #include <vector>
     11 #include <fstream>
     12 #include <set>
     13 #define  inf 999999;
     14 
     15 using namespace std;
     16 int n;
     17 struct treenode {
     18     char value[30];
     19     int lay;
     20     treenode *parent, *right,*child;
     21     treenode() {
     22         lay = 0;
     23         parent = NULL, right = NULL,child=NULL;
     24     }
     25     treenode(char*val) {
     26         int i;
     27         for (i = 0; val[i]; i++)
     28             value[i] = val[i];
     29         value[i] = 0;
     30         lay = 0;
     31         parent = NULL, right = NULL, child = NULL;
     32     }
     33     void setchild(treenode*x) {
     34         child = x;
     35     }
     36     void setparent(treenode*x){
     37         parent = x;
     38     }
     39     void setright(treenode*x) {
     40         right = x;
     41     }
     42 };
     43 
     44 bool printbro(treenode*rt, char*val) {
     45     if (rt == NULL)return false;
     46     if (strcmp(rt->value, val) == 0)
     47     {
     48         rt = rt->right;
     49         while (rt) {
     50             printf("%s", rt->value);
     51             rt = rt->right;
     52         }
     53         printf("
    ");
     54         return true;
     55     }
     56     bool now = printbro(rt->child, val);
     57     if (now)return true;
     58     return printbro(rt->right, val);
     59 }
     60 
     61 void init() {
     62     scanf("%d",&n);
     63     cin.ignore();
     64     while (n--) {
     65         char line[30], tmp[30];
     66         cin.getline(line, sizeof(line), '
    ');
     67         sscanf(line, "%s", tmp);
     68         treenode*rt=new treenode(tmp);
     69         treenode*now = rt;
     70         int layer = 0;
     71         while (1)
     72         {
     73             char line[30] = { 0 }, tmp[30] = { 0 };
     74             cin.getline(line, 30, '
    ');
     75             sscanf(line, "%s", tmp);
     76             if (strlen(tmp) == 0)break;
     77             if (tmp[0] == '{')
     78                 layer++;
     79             else if (tmp[0] == '}')layer--;
     80             else {
     81                 treenode*thenode=new treenode(tmp);
     82                 if (now->lay == layer) {
     83                     now->setright(thenode);
     84                     thenode->setparent(now->parent);
     85                 }
     86                 else if (now->lay > layer) {
     87                     while (now->lay > layer)
     88                         now = now->parent;
     89                     now->setright(thenode);
     90                     thenode->setparent(now->parent);
     91                 }
     92                 else if (now->lay < layer) {
     93                     now->setchild(thenode);
     94                     thenode->setparent(now);
     95                 }
     96                 now = thenode;
     97                 now->lay = layer;
     98             }
     99         }
    100         cin.getline(line, sizeof(line), '
    ');
    101         sscanf(line, "%s", tmp);
    102         cin.getline(line, sizeof(line), '
    ');
    103         cin.getline(line, sizeof(line), '
    ');
    104         if(!printbro(rt,tmp))
    105             printf("No
    ");
    106     }
    107     char line[30];
    108     cin.getline(line, sizeof(line), '
    ');
    109 }
    110 
    111 int main()
    112 {
    113     init();
    114     return 0;
    115 }
    View Code

    二叉搜索树的层次遍历(10分)

    题目内容:

    二叉搜索树在动态查表中有特别的用处,一个无序序列可以通过构造一棵二叉搜索树变成一个有序序列,

    构造树的过程即为对无序序列进行排序的过程。每次插入的新的结点都是二叉搜索树上新的叶子结点,在进行

    插入操作时,不必移动其它结点,只需改动某个结点的指针,由空变为非空即可。

         这里,我们想探究二叉树的建立和层次输出。

    输入格式:

    只有一行,包含若干个数字,中间用空格隔开。(数字可能会有重复,对于重复的数字,只计入一个)

    输出格式:

    输出一行,对输入数字建立二叉搜索树后进行按层次周游的结果。

    输入样例:

    51 45 59 86 45 4 15 76 60 20 61 77 62 30 2 37 13 82 19 74 2 79 79 97 33 90 11 7 29 14 50 1 96 59 91 39 34 6 72 7

    输出样例:

    51 45 59 4 50 86 2 15 76 97 1 13 20 60 77 90 11 14 19 30 61 82 96 7 29 37 62 79 91 6 33 39 74 34 72

    提示:

    输入输出的最后都不带空格和回车换行

     1 #include <iostream>
     2 #include <string.h>
     3 #include <algorithm>
     4 #include <stack>
     5 #include <string>
     6 #include <math.h>
     7 #include <queue>
     8 #include <stdio.h>
     9 #include <string.h>
    10 #include <vector>
    11 #include <fstream>
    12 #include <set>
    13 #define  inf 999999;
    14 
    15 using namespace std;
    16 int n;
    17 struct treenode {
    18     int val;
    19     treenode *left, *right;
    20     treenode() {
    21         val = -1, left= NULL,right = NULL;
    22     }
    23     treenode(int n) {
    24         val = n, left = NULL, right = NULL;
    25     }
    26 }*rt;
    27 
    28 void build(treenode*root, int val) {
    29     if (root->val == val)return;
    30     if (val > root->val) {
    31         if (root->right)
    32             build(root->right, val);
    33         else
    34             root->right = new treenode(val);
    35     }
    36     else if (val < root->val) {
    37         if (root->left)
    38             build(root->left, val);
    39         else
    40             root->left = new treenode(val);
    41     }
    42 }
    43 
    44 void print() {
    45     queue<treenode*>all;
    46     printf("%d", rt->val);
    47     if(rt->left)
    48         all.push(rt->left);
    49     if (rt->right)
    50         all.push(rt->right);
    51     while (!all.empty()) {
    52         treenode*now = all.front(); all.pop();
    53         printf(" %d", now->val);
    54         if (now->left)
    55             all.push(now->left);
    56         if (now->right)
    57             all.push(now->right);
    58     }
    59 }
    60 
    61 void init() {
    62     int i=0,x;
    63     cin >> x;
    64     rt=new treenode(x);
    65     while (cin>>x) {
    66         build(rt, x);
    67     }
    68     print();
    69 }
    70 
    71 int main()
    72 {
    73     init();
    74     return 0;
    75 }
    View Code

    数据应该都不是很强,有点怀疑到底做对没有

    好几天都忘发了,今天补上

    注定失败的战争,也要拼尽全力去打赢它; 就算输,也要输得足够漂亮。
  • 相关阅读:
    BOZJ 3551&BZOJ 3545 kruskal重构树
    [Poi2014]FarmCraft
    NOIP 2015 斗地主
    POJ 1704 Georgia and Bob
    BZOJ 1409 快速幂+欧拉定理
    最长公共子序列(LCS)
    神奇的口袋(百练2755)
    最长上升子序列(LIS)
    《Single Image Haze Removal Using Dark Channel Prior》去雾代码实现分析
    MATLAB中的nargin与varargin
  • 原文地址:https://www.cnblogs.com/yalphait/p/9952449.html
Copyright © 2011-2022 走看看