第1关:求森林的叶子节点数
任务描述
本关任务:请在右侧编辑器的注释行填入适当内容来完成算法,以实现指定的功能,并通过运行来验证。
相关知识
实验目的
- 掌握树和森林的二叉链表表示方法;
- 掌握树和二叉树的结构及算法之间的对应关系;
- 掌握树的两种遍历算法及其应用。
树和森林也是软件设计中较为常用的结构,其基本运算也是遍历运算。由于其存储结构主要采用二叉链表存储形式,因此其运算也基于二叉树的运算。本次实验需要加深对树的存储结构,尤其是二叉链表存储结构的理解,掌握树和二叉树之间的对应关系,熟练掌握树的遍历算法及其应用。
实验任务
说明:为使实验程序简洁直观,下面的部分实验程序中的一些功能实现仍以调用库函数程序"trees.h"中的函数的形式给出,并假设该库函数中定义了树指针和结点类型分别为tree和tnode,以及部分常用运算,例如构建树(森林)、以某种方式显示树和森林等。各运算的名称较为直观,因而易于理解。
实验说明
树的存储结构及类型描述
在实验中,树和森林采用的是孩子-兄弟链表表示法(即二叉链表表示法),其结点类型为tnode,指示结点的指针类型为tree。每个结点中有存放(字符型)数据的字段data,有指示其第一个孩子结点的指针firstson及指示其下一个兄弟结点的指针nextbrother。说明如下:
struct tnode { //树结构结点类型
struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
char data; // 数据字段
};
typedef struct tnode * tree; // 树结构指针类型
编程要求
请在右侧编辑器的注释行填入适当内容来完成算法,以使算法leaf能返回t为第一棵树的森林中的叶子结点数,并通过运行来验证。
测试说明
平台会对你编写的代码进行测试:
右侧数据框说明:
测试输入:
一个字符串表示树或森林的广义表形式字符串
结构体说明:
struct tnode { //树结构结点类型
struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
char data; // 数据字段
};
typedef struct tnode * tree; // 树结构指针类型
库函数说明:
void display_tree(char * s, bitre & t);
第一行输出字符串 s:
第二行输出树或森林 t 的广义表形式
库函数详细可查看右侧头文件 "trees.h"
开始你的任务吧,祝你成功!
#include "trees.h" // 引用库函数文件
namespace exa { //请在命名空间内编写代码,否则后果自负
int leaf(tree t)
{
if (t == NULL) return 0;
else {
if (t->firstson==NULL) return 1+leaf(t->nextbrother);//Blank 1
else return leaf(t->nextbrother)+leaf(t->firstson);//Blank 2
}
}
void solve()
{
tree t;
load_tree(t); // 建立树
display_tree("transed tree", t); // 显示树
printf("Leaf=%d\n", leaf(t)); // 调用算法以检验
}
}
第2关:树转化为二叉树
任务描述
本关任务:将一棵树(或森林)转换为二叉树。
相关知识
实验目的
- 掌握树和森林的二叉链表表示方法;
- 掌握树和二叉树的结构及算法之间的对应关系;
- 掌握树的两种遍历算法及其应用。
树和森林也是软件设计中较为常用的结构,其基本运算也是遍历运算。由于其存储结构主要采用二叉链表存储形式,因此其运算也基于二叉树的运算。本次实验需要加深对树的存储结构,尤其是二叉链表存储结构的理解,掌握树和二叉树之间的对应关系,熟练掌握树的遍历算法及其应用。
实验任务
说明:为使实验程序简洁直观,下面的部分实验程序中的一些功能实现仍以调用库函数程序"trees.h"中的函数的形式给出,并假设该库函数中定义了树指针和结点类型分别为tree和tnode,以及部分常用运算,例如构建树(森林)、以某种方式显示树和森林等。各运算的名称较为直观,因而易于理解。
实验说明
树的存储结构及类型描述
在实验中,树和森林采用的是孩子-兄弟链表表示法(即二叉链表表示法),其结点类型为tnode,指示结点的指针类型为tree。每个结点中有存放(字符型)数据的字段data,有指示其第一个孩子结点的指针firstson及指示其下一个兄弟结点的指针nextbrother。说明如下:
struct tnode { //树结构结点类型
struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
char data; // 数据字段
};
typedef struct tnode * tree; // 树结构指针类型
编程要求
请在右侧编辑器的solve函数里填写相关代码,实现将一棵树(或森林)转换为二叉树。
测试说明
平台会对你编写的代码进行测试:
函数说明:
bitre solve(string s);
参数 s 为树或森林的广义表形式字符串
返回值为转化后二叉树的根节点
右侧数据框说明:
测试输入:
一个字符串表示树或森林的广义表形式字符串
实际输出:
输出 display_bitre_ 里的内容
结构体说明:
struct tnode { //树结构结点类型
struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
char data; // 数据字段
};
typedef struct tnode * tree; // 树结构指针类型
库函数说明:
void display_tree(char * s, bitre & t);
第一行输出字符串 s:
第二行输出树或森林 t 的广义表形式
库函数详细可查看右侧头文件 "trees.h"
开始你的任务吧,祝你成功!
#include "trees.h" // 引用库函数文件
namespace exa { //请在命名空间内编写代码,否则后果自负
bitre solve(string s)
{
bitre t;
int n = s.length();
if (n == 2) t = NULL;
else {
stack<bitre> st;
stack<char>flag;
t = (bitre)malloc(sizeof(bnode));
t->data = s[1];
t->lchild = t->rchild = NULL;
st.push(t);
for (int i = 2; i <= n-2; ++i) {
if (s[i] == '(' || s[i] == ',') flag.push(s[i]);
else if (s[i] == ')') st.pop(), flag.pop();
else {
bitre tmp = (bitre)malloc(sizeof(bnode));
tmp->data = s[i];
tmp->lchild = tmp->rchild = NULL;
if (flag.top() == ',') st.top()->rchild = tmp, st.pop();
else st.top()->lchild = tmp;
st.push(tmp);
}
}
}
return t;
}
}
第3关:求森林的高度
任务描述
本关任务:求森林的高度。
相关知识
实验目的
- 掌握树和森林的二叉链表表示方法;
- 掌握树和二叉树的结构及算法之间的对应关系;
- 掌握树的两种遍历算法及其应用。
树和森林也是软件设计中较为常用的结构,其基本运算也是遍历运算。由于其存储结构主要采用二叉链表存储形式,因此其运算也基于二叉树的运算。本次实验需要加深对树的存储结构,尤其是二叉链表存储结构的理解,掌握树和二叉树之间的对应关系,熟练掌握树的遍历算法及其应用。
实验任务
说明:为使实验程序简洁直观,下面的部分实验程序中的一些功能实现仍以调用库函数程序"trees.h"中的函数的形式给出,并假设该库函数中定义了树指针和结点类型分别为tree和tnode,以及部分常用运算,例如构建树(森林)、以某种方式显示树和森林等。各运算的名称较为直观,因而易于理解。
实验说明
树的存储结构及类型描述
在实验中,树和森林采用的是孩子-兄弟链表表示法(即二叉链表表示法),其结点类型为tnode,指示结点的指针类型为tree。每个结点中有存放(字符型)数据的字段data,有指示其第一个孩子结点的指针firstson及指示其下一个兄弟结点的指针nextbrother。说明如下:
struct tnode { //树结构结点类型
struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
char data; // 数据字段
};
typedef struct tnode * tree; // 树结构指针类型
编程要求
请在右侧编辑器的命名空间内填写相关代码,实现求森林的高度。 若题目有其它要求,应当将题目要求的结果在solve函数内通过返回或引用的形式传递参数。
测试说明
平台会对你编写的代码进行测试:
函数说明:
int solve(tree t);
参数 t 为森林的第一颗树的根节点
返回值为森林的高度
右侧数据框说明:
测试输入:
一个字符串表示树或森林的广义表形式字符串
实际输出:
输出你返回的整数
结构体说明:
struct tnode { //树结构结点类型
struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
char data; // 数据字段
};
typedef struct tnode * tree; // 树结构指针类型
库函数说明:
void display_tree(char * s, bitre & t);
第一行输出字符串 s:
第二行输出树或森林 t 的广义表形式
库函数详细可查看右侧头文件 "trees.h"
开始你的任务吧,祝你成功!
#include "trees.h" // 引用库函数文件
namespace exa { //请在命名空间内编写代码,否则后果自负
int solve(tree t)
{
if(t==NULL)return 0;
else
{
int a,b;
a=solve(t->firstson)+1;
b=solve(t->nextbrother);
return max(a,b);
}
}
}
第4关:层次遍历森林
任务描述
本关任务:按层次方式遍历森林。
相关知识
实验目的
- 掌握树和森林的二叉链表表示方法;
- 掌握树和二叉树的结构及算法之间的对应关系;
- 掌握树的两种遍历算法及其应用。
树和森林也是软件设计中较为常用的结构,其基本运算也是遍历运算。由于其存储结构主要采用二叉链表存储形式,因此其运算也基于二叉树的运算。本次实验需要加深对树的存储结构,尤其是二叉链表存储结构的理解,掌握树和二叉树之间的对应关系,熟练掌握树的遍历算法及其应用。
实验任务
说明:为使实验程序简洁直观,下面的部分实验程序中的一些功能实现仍以调用库函数程序"trees.h"中的函数的形式给出,并假设该库函数中定义了树指针和结点类型分别为tree和tnode,以及部分常用运算,例如构建树(森林)、以某种方式显示树和森林等。各运算的名称较为直观,因而易于理解。
实验说明
树的存储结构及类型描述
在实验中,树和森林采用的是孩子-兄弟链表表示法(即二叉链表表示法),其结点类型为tnode,指示结点的指针类型为tree。每个结点中有存放(字符型)数据的字段data,有指示其第一个孩子结点的指针firstson及指示其下一个兄弟结点的指针nextbrother。说明如下:
struct tnode { //树结构结点类型
struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
char data; // 数据字段
};
typedef struct tnode * tree; // 树结构指针类型
编程要求
请在右侧编辑器的命名空间内填写相关代码,实现按层次方式遍历森林。 若题目有其它要求,应当将题目要求的结果在solve函数内通过返回或引用的形式传递参数。
测试说明
平台会对你编写的代码进行测试:
函数说明:
void solve(tree t);
参数 t 为森林的第一颗树的根节点
右侧数据框说明:
测试输入:
一个字符串表示树或森林的广义表形式字符串
实际输出:
你需要在函数内输出 n 行,每行一个字符,依次为按层次遍历森林时访问的节点值
结构体说明:
struct tnode { //树结构结点类型
struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
char data; // 数据字段
};
typedef struct tnode * tree; // 树结构指针类型
库函数说明:
void display_tree(char * s, bitre & t);
第一行输出字符串 s:
第二行输出树或森林 t 的广义表形式
库函数详细可查看右侧头文件 "trees.h"
开始你的任务吧,祝你成功!
#include "trees.h" // 引用库函数文件
namespace exa { //请在命名空间内编写代码,否则后果自负
void solve(tree t)
{
queue<tree> q;
q.push(t);
while(!q.empty())
{
int len=q.size();
tree node;
for(int i=1;i<=len;i++)
{
node=q.front();
q.pop();
while(node)
{
cout<<node->data<<endl;
if(node->firstson)
{
q.push(node->firstson);
}
node=node->nextbrother;
}
}
}
}
}
第5关:输出森林中节点的值和层数
任务描述
本关任务:输出一个森林中每个结点的值及其对应的层次数。
相关知识
实验目的
- 掌握树和森林的二叉链表表示方法;
- 掌握树和二叉树的结构及算法之间的对应关系;
- 掌握树的两种遍历算法及其应用。
树和森林也是软件设计中较为常用的结构,其基本运算也是遍历运算。由于其存储结构主要采用二叉链表存储形式,因此其运算也基于二叉树的运算。本次实验需要加深对树的存储结构,尤其是二叉链表存储结构的理解,掌握树和二叉树之间的对应关系,熟练掌握树的遍历算法及其应用。
实验任务
说明:为使实验程序简洁直观,下面的部分实验程序中的一些功能实现仍以调用库函数程序"trees.h"中的函数的形式给出,并假设该库函数中定义了树指针和结点类型分别为tree和tnode,以及部分常用运算,例如构建树(森林)、以某种方式显示树和森林等。各运算的名称较为直观,因而易于理解。
实验说明
树的存储结构及类型描述
在实验中,树和森林采用的是孩子-兄弟链表表示法(即二叉链表表示法),其结点类型为tnode,指示结点的指针类型为tree。每个结点中有存放(字符型)数据的字段data,有指示其第一个孩子结点的指针firstson及指示其下一个兄弟结点的指针nextbrother。说明如下:
struct tnode { //树结构结点类型
struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
char data; // 数据字段
};
typedef struct tnode * tree; // 树结构指针类型
编程要求
请在右侧编辑器的命名空间内填写相关代码,实现按层次遍历输出一个森林中每个结点的值及其对应的层次数。 若题目有其它要求,应当将题目要求的结果在solve函数内通过返回或引用的形式传递参数。
测试说明
平台会对你编写的代码进行测试:
函数说明:
void solve(tree t);
参数 t 为森林的第一颗树的根节点
右侧数据框说明:
测试输入:
一个字符串表示树或森林的广义表形式字符串
实际输出:
你需要在函数内输出 n 行,每行一个字符 ci 和一个整数 li,依次为按层次遍历森林时访问的节点值和节点层数
结构体说明:
struct tnode { //树结构结点类型
struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
char data; // 数据字段
};
typedef struct tnode * tree; // 树结构指针类型
库函数说明:
void display_tree(char * s, bitre & t);
第一行输出字符串 s:
第二行输出树或森林 t 的广义表形式
库函数详细可查看右侧头文件 "trees.h"
开始你的任务吧,祝你成功!
#include "trees.h" // 引用库函数文件
namespace exa { //请在命名空间内编写代码,否则后果自负
void solve(tree t)
{
queue<tree> q;
q.push(t);
int height=0;
while(!q.empty())
{
int len=q.size();
tree node;
for(int i=1;i<=len;i++)
{
node=q.front();
q.pop();
while(node)
{
cout<<node->data<<" ";
cout<<height+1<<endl;
if(node->firstson)
{
q.push(node->firstson);
}
node=node->nextbrother;
}
}
height++;
}
}
}
第6关:森林的广义表形式
任务描述
本关任务:输出一个森林的广义表形式。
相关知识
实验目的
- 掌握树和森林的二叉链表表示方法;
- 掌握树和二叉树的结构及算法之间的对应关系;
- 掌握树的两种遍历算法及其应用。
树和森林也是软件设计中较为常用的结构,其基本运算也是遍历运算。由于其存储结构主要采用二叉链表存储形式,因此其运算也基于二叉树的运算。本次实验需要加深对树的存储结构,尤其是二叉链表存储结构的理解,掌握树和二叉树之间的对应关系,熟练掌握树的遍历算法及其应用。
实验任务
说明:为使实验程序简洁直观,下面的部分实验程序中的一些功能实现仍以调用库函数程序"trees.h"中的函数的形式给出,并假设该库函数中定义了树指针和结点类型分别为tree和tnode,以及部分常用运算,例如构建树(森林)、以某种方式显示树和森林等。各运算的名称较为直观,因而易于理解。
实验说明
树的存储结构及类型描述
在实验中,树和森林采用的是孩子-兄弟链表表示法(即二叉链表表示法),其结点类型为tnode,指示结点的指针类型为tree。每个结点中有存放(字符型)数据的字段data,有指示其第一个孩子结点的指针firstson及指示其下一个兄弟结点的指针nextbrother。说明如下:
struct tnode { //树结构结点类型
struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
char data; // 数据字段
};
typedef struct tnode * tree; // 树结构指针类型
编程要求
请在右侧编辑器的命名空间内填写相关代码,实现输出一个森林的广义表形式。 若题目有其它要求,应当将题目要求的结果在solve函数内通过返回或引用的形式传递参数。
测试说明
平台会对你编写的代码进行测试:
函数说明:
string solve(tree t);
参数 t 为森林的第一颗树的根节点
返回一个字符串表示森林的广义表形式字符串
右侧数据框说明:
测试输入:
一个字符串表示树或森林的广义表形式字符串
实际输出:
输出你返回的字符串
结构体说明:
struct tnode { //树结构结点类型
struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
char data; // 数据字段
};
typedef struct tnode * tree; // 树结构指针类型
库函数说明:
void display_tree(char * s, bitre & t);
第一行输出字符串 s:
第二行输出树或森林 t 的广义表形式
库函数详细可查看右侧头文件 "trees.h"
开始你的任务吧,祝你成功!
#include "trees.h" // 引用库函数文件
namespace exa { //请在命名空间内编写代码,否则后果自负
string solve(tree t)
{
string ans;
ans += '(';
ans += dfs(t);
ans += ')';
return ans;
}
}