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\n", depth(1));
41     return 0;
42 }

物质分解记录(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, ‘\n‘);
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("\n");
 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), ‘\n‘);
 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, ‘\n‘);
 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), ‘\n‘);
101         sscanf(line, "%s", tmp);
102         cin.getline(line, sizeof(line), ‘\n‘);
103         cin.getline(line, sizeof(line), ‘\n‘);
104         if(!printbro(rt,tmp))
105             printf("No\n");
106     }
107     char line[30];
108     cin.getline(line, sizeof(line), ‘\n‘);
109 }
110
111 int main()
112 {
113     init();
114     return 0;
115 }

二叉搜索树的层次遍历(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 }

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

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

原文地址:https://www.cnblogs.com/yalphait/p/9952449.html

时间: 2024-10-22 02:17:15

18.11.13 二叉树三则的相关文章

SDUT 3342 数据结构实验之二叉树三:统计叶子数

数据结构实验之二叉树三:统计叶子数 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知二叉树的一个按先序遍历输入的字符序列,如abc,,de,g,,f,,, (其中,表示空结点).请建立二叉树并求二叉树的叶子结点个数. Input 连续输入多组数据,每组数据输入一个长度小于50个字符的字符串. Output 输出二叉树的叶子结点个数. Example Input abc,,de,g,,f

[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口IXmlSerializable实现XML序列化及XML通用类

[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口IXmlSerializable实现XML序列化及XML通用类 本节导读:本节主要介绍通过序列化接口IXmlSerializable实现XML序列化和反序列化,整理了XML基础操作及序列化的通用类(包括XML及节点的基础读写操作,XML到DataSet\DataTable互转换操作,XML序列化及反序列化通用方法等). 读前必备: A.类和类的实例 [.net 面向对象编程基础]  (9) 类和类的

11求二叉树中节点的最大距离

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4253605.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:如果我们把二叉树看成一个图,一棵树显示是一颗有向无环图,定义"距离"为两节点之间边的个数(不考虑方向).写一个程序,求一棵二叉树中相距最远的两个节点

现代软件工程_团队项目_阿尔法阶段_第二次会议记录_2017.11.13

第二次会议记录 会议时间:2017.11.13  12:00-12::30 会议地点:中科大西区第三教学楼A教一楼讨论区 参会人员:刘荪傲 姜博文 顾培健 徐宇飞 张淦霖 [内容一]:页面原型v1.0展示 (一)介绍 经过对比,我们采用了mockplus做页面原型设计软件.于11月12日设计出了v1.0版本. 版本结构如下: v1.0 1.0.0 登录 1.0.1 创建新用户 1.0.2 找回密码 1.0.3 已有自习列表 1.0.4 发布我的自习 1.0.5 我已完成的自习 1.0.6 该自习

二叉树三种遍历(递归以及非递归实现)

package com.shiyeqiang.tree; import java.util.Stack; public class BiTree { public static void main(String[] args) { // 首先构造叶子节点 BiTree leafA1 = new BiTree(4); BiTree leafA2 = new BiTree(5); BiTree leafB1 = new BiTree(6); BiTree leafB2 = new BiTree(7)

[CareerCup] 18.11 Maximum Subsquare 最大子方形

18.11 Imagine you have a square matrix, where each cell (pixel) is either black or white. Design an algorithm to find the maximum subsquare such that all four borders are filled with black pixels. LeetCode上的原题,请参见我之前的解法Maximal Square.书上给了两种解法,但是比较长:

数据结构 《22》---- 二叉树三种遍历的迭代器算法

二叉树的三种遍历有递归版本,和迭代版本.本文介绍一种新的思路. 参考了 http://coolshell.cn/articles/9886.html 在许多应用中,我们还需要对遍历本身进行抽象.假如有一个求和的函数sum,我们希望它能应用于链表,数组,二叉树等等不同的数据结构.这时,我们可以抽象出迭代器(Iterator)的概念,通过迭代器把算法和数据结构解耦了,使得通用算法能应用于不同类型的数据结构. 以下给出了三种遍历的迭代器算法. class Iterator { public: virt

数据库2014年6月10日11:13:10

SQL语句创建数据库: create table student(id int not null primary key,number nvarchar not null,name nvarchar not null,brithday DateTime default getdate(), adress nvarchar ) 创建一个学生表,主键为id,not null 表示不为空,default getdate()表示设定默认值为当前时间. 空值处理函数:select isnull (Name

日本IT行业劳动力缺口达22万 在日中国留学生迎来就业好时机 2017/07/18 11:25:09

作者:倪亚敏 来源:日本新华侨报 发布时间:2017/07/18 11:25:09   据日本政府提供的数据,日本2018年应届毕业生的"求人倍率"已经达到了1.78倍.换言之,就是100名大学生里有178个就业岗位可选择,即使所有大学毕业生都进入劳动力市场,也还有78个岗位空缺.劳动力现状是寒冷冬天,而学生们确实迎来了就业春天. 在众多岗位当中,日本的信息技术(IT)领域采用的外国人留学生最多.去年,已经在日本企业就职的留学生当中(除去制造行业),27.3%的毕业生进入了IT行业.根