18.11.13 二叉树三则

Posted yalphait

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

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

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

 

以上是关于18.11.13 二叉树三则的主要内容,如果未能解决你的问题,请参考以下文章

二叉树三序遍历

二叉树三种深度遍历方法和实现

二叉树三种遍历的非递归实现

二叉树三种遍历的非递归实现

二叉树三序遍历

对二叉树三种遍历的理解