树和森林实验

第1关:求森林的叶子节点数

任务描述

本关任务:请在右侧编辑器的注释行填入适当内容来完成算法,以实现指定的功能,并通过运行来验证。

相关知识

实验目的

  1. 掌握树和森林的二叉链表表示方法;
  2. 掌握树和二叉树的结构及算法之间的对应关系;
  3. 掌握树的两种遍历算法及其应用。

树和森林也是软件设计中较为常用的结构,其基本运算也是遍历运算。由于其存储结构主要采用二叉链表存储形式,因此其运算也基于二叉树的运算。本次实验需要加深对树的存储结构,尤其是二叉链表存储结构的理解,掌握树和二叉树之间的对应关系,熟练掌握树的遍历算法及其应用。

实验任务

说明:为使实验程序简洁直观,下面的部分实验程序中的一些功能实现仍以调用库函数程序"trees.h"中的函数的形式给出,并假设该库函数中定义了树指针和结点类型分别为tree和tnode,以及部分常用运算,例如构建树(森林)、以某种方式显示树和森林等。各运算的名称较为直观,因而易于理解。

实验说明

树的存储结构及类型描述

在实验中,树和森林采用的是孩子-兄弟链表表示法(即二叉链表表示法),其结点类型为tnode,指示结点的指针类型为tree。每个结点中有存放(字符型)数据的字段data,有指示其第一个孩子结点的指针firstson及指示其下一个兄弟结点的指针nextbrother。说明如下:

 
  1. struct tnode { //树结构结点类型
  2. struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
  3. char data; // 数据字段
  4. };
  5. typedef struct tnode * tree; // 树结构指针类型

编程要求

请在右侧编辑器的注释行填入适当内容来完成算法,以使算法leaf能返回t为第一棵树的森林中的叶子结点数,并通过运行来验证。

测试说明

平台会对你编写的代码进行测试:

 
  1. 右侧数据框说明:
  2. 测试输入:
  3. 一个字符串表示树或森林的广义表形式字符串
  4. 结构体说明:
  5. struct tnode { //树结构结点类型
  6. struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
  7. char data; // 数据字段
  8. };
  9. typedef struct tnode * tree; // 树结构指针类型
  10. 库函数说明:
  11. void display_tree(char * s, bitre & t);
  12. 第一行输出字符串 s:
  13. 第二行输出树或森林 t 的广义表形式
  14. 库函数详细可查看右侧头文件 "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关:树转化为二叉树

任务描述

本关任务:将一棵树(或森林)转换为二叉树。

相关知识

实验目的

  1. 掌握树和森林的二叉链表表示方法;
  2. 掌握树和二叉树的结构及算法之间的对应关系;
  3. 掌握树的两种遍历算法及其应用。

树和森林也是软件设计中较为常用的结构,其基本运算也是遍历运算。由于其存储结构主要采用二叉链表存储形式,因此其运算也基于二叉树的运算。本次实验需要加深对树的存储结构,尤其是二叉链表存储结构的理解,掌握树和二叉树之间的对应关系,熟练掌握树的遍历算法及其应用。

实验任务

说明:为使实验程序简洁直观,下面的部分实验程序中的一些功能实现仍以调用库函数程序"trees.h"中的函数的形式给出,并假设该库函数中定义了树指针和结点类型分别为tree和tnode,以及部分常用运算,例如构建树(森林)、以某种方式显示树和森林等。各运算的名称较为直观,因而易于理解。

实验说明

树的存储结构及类型描述

在实验中,树和森林采用的是孩子-兄弟链表表示法(即二叉链表表示法),其结点类型为tnode,指示结点的指针类型为tree。每个结点中有存放(字符型)数据的字段data,有指示其第一个孩子结点的指针firstson及指示其下一个兄弟结点的指针nextbrother。说明如下:

 
  1. struct tnode { //树结构结点类型
  2. struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
  3. char data; // 数据字段
  4. };
  5. typedef struct tnode * tree; // 树结构指针类型

编程要求

请在右侧编辑器的solve函数里填写相关代码,实现将一棵树(或森林)转换为二叉树。

测试说明

平台会对你编写的代码进行测试:

 
  1. 函数说明:
  2. bitre solve(string s);
  3. 参数 s 为树或森林的广义表形式字符串
  4. 返回值为转化后二叉树的根节点
  5. 右侧数据框说明:
  6. 测试输入:
  7. 一个字符串表示树或森林的广义表形式字符串
  8. 实际输出:
  9. 输出 display_bitre_ 里的内容
  10. 结构体说明:
  11. struct tnode { //树结构结点类型
  12. struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
  13. char data; // 数据字段
  14. };
  15. typedef struct tnode * tree; // 树结构指针类型
  16. 库函数说明:
  17. void display_tree(char * s, bitre & t);
  18. 第一行输出字符串 s:
  19. 第二行输出树或森林 t 的广义表形式
  20. 库函数详细可查看右侧头文件 "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关:求森林的高度

任务描述

本关任务:求森林的高度。

相关知识

实验目的

  1. 掌握树和森林的二叉链表表示方法;
  2. 掌握树和二叉树的结构及算法之间的对应关系;
  3. 掌握树的两种遍历算法及其应用。

树和森林也是软件设计中较为常用的结构,其基本运算也是遍历运算。由于其存储结构主要采用二叉链表存储形式,因此其运算也基于二叉树的运算。本次实验需要加深对树的存储结构,尤其是二叉链表存储结构的理解,掌握树和二叉树之间的对应关系,熟练掌握树的遍历算法及其应用。

实验任务

说明:为使实验程序简洁直观,下面的部分实验程序中的一些功能实现仍以调用库函数程序"trees.h"中的函数的形式给出,并假设该库函数中定义了树指针和结点类型分别为tree和tnode,以及部分常用运算,例如构建树(森林)、以某种方式显示树和森林等。各运算的名称较为直观,因而易于理解。

实验说明

树的存储结构及类型描述

在实验中,树和森林采用的是孩子-兄弟链表表示法(即二叉链表表示法),其结点类型为tnode,指示结点的指针类型为tree。每个结点中有存放(字符型)数据的字段data,有指示其第一个孩子结点的指针firstson及指示其下一个兄弟结点的指针nextbrother。说明如下:

 
  1. struct tnode { //树结构结点类型
  2. struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
  3. char data; // 数据字段
  4. };
  5. typedef struct tnode * tree; // 树结构指针类型

编程要求

请在右侧编辑器的命名空间内填写相关代码,实现求森林的高度。 若题目有其它要求,应当将题目要求的结果在solve函数内通过返回或引用的形式传递参数。

测试说明

平台会对你编写的代码进行测试:

 
  1. 函数说明:
  2. int solve(tree t);
  3. 参数 t 为森林的第一颗树的根节点
  4. 返回值为森林的高度
  5. 右侧数据框说明:
  6. 测试输入:
  7. 一个字符串表示树或森林的广义表形式字符串
  8. 实际输出:
  9. 输出你返回的整数
  10. 结构体说明:
  11. struct tnode { //树结构结点类型
  12. struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
  13. char data; // 数据字段
  14. };
  15. typedef struct tnode * tree; // 树结构指针类型
  16. 库函数说明:
  17. void display_tree(char * s, bitre & t);
  18. 第一行输出字符串 s:
  19. 第二行输出树或森林 t 的广义表形式
  20. 库函数详细可查看右侧头文件 "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关:层次遍历森林

任务描述

本关任务:按层次方式遍历森林。

相关知识

实验目的

  1. 掌握树和森林的二叉链表表示方法;
  2. 掌握树和二叉树的结构及算法之间的对应关系;
  3. 掌握树的两种遍历算法及其应用。

树和森林也是软件设计中较为常用的结构,其基本运算也是遍历运算。由于其存储结构主要采用二叉链表存储形式,因此其运算也基于二叉树的运算。本次实验需要加深对树的存储结构,尤其是二叉链表存储结构的理解,掌握树和二叉树之间的对应关系,熟练掌握树的遍历算法及其应用。

实验任务

说明:为使实验程序简洁直观,下面的部分实验程序中的一些功能实现仍以调用库函数程序"trees.h"中的函数的形式给出,并假设该库函数中定义了树指针和结点类型分别为tree和tnode,以及部分常用运算,例如构建树(森林)、以某种方式显示树和森林等。各运算的名称较为直观,因而易于理解。

实验说明

树的存储结构及类型描述

在实验中,树和森林采用的是孩子-兄弟链表表示法(即二叉链表表示法),其结点类型为tnode,指示结点的指针类型为tree。每个结点中有存放(字符型)数据的字段data,有指示其第一个孩子结点的指针firstson及指示其下一个兄弟结点的指针nextbrother。说明如下:

 
  1. struct tnode { //树结构结点类型
  2. struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
  3. char data; // 数据字段
  4. };
  5. typedef struct tnode * tree; // 树结构指针类型

编程要求

请在右侧编辑器的命名空间内填写相关代码,实现按层次方式遍历森林。 若题目有其它要求,应当将题目要求的结果在solve函数内通过返回或引用的形式传递参数。

测试说明

平台会对你编写的代码进行测试:

 
  1. 函数说明:
  2. void solve(tree t);
  3. 参数 t 为森林的第一颗树的根节点
  4. 右侧数据框说明:
  5. 测试输入:
  6. 一个字符串表示树或森林的广义表形式字符串
  7. 实际输出:
  8. 你需要在函数内输出 n 行,每行一个字符,依次为按层次遍历森林时访问的节点值
  9. 结构体说明:
  10. struct tnode { //树结构结点类型
  11. struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
  12. char data; // 数据字段
  13. };
  14. typedef struct tnode * tree; // 树结构指针类型
  15. 库函数说明:
  16. void display_tree(char * s, bitre & t);
  17. 第一行输出字符串 s:
  18. 第二行输出树或森林 t 的广义表形式
  19. 库函数详细可查看右侧头文件 "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关:输出森林中节点的值和层数

任务描述

本关任务:输出一个森林中每个结点的值及其对应的层次数。

相关知识

实验目的

  1. 掌握树和森林的二叉链表表示方法;
  2. 掌握树和二叉树的结构及算法之间的对应关系;
  3. 掌握树的两种遍历算法及其应用。

树和森林也是软件设计中较为常用的结构,其基本运算也是遍历运算。由于其存储结构主要采用二叉链表存储形式,因此其运算也基于二叉树的运算。本次实验需要加深对树的存储结构,尤其是二叉链表存储结构的理解,掌握树和二叉树之间的对应关系,熟练掌握树的遍历算法及其应用。

实验任务

说明:为使实验程序简洁直观,下面的部分实验程序中的一些功能实现仍以调用库函数程序"trees.h"中的函数的形式给出,并假设该库函数中定义了树指针和结点类型分别为tree和tnode,以及部分常用运算,例如构建树(森林)、以某种方式显示树和森林等。各运算的名称较为直观,因而易于理解。

实验说明

树的存储结构及类型描述

在实验中,树和森林采用的是孩子-兄弟链表表示法(即二叉链表表示法),其结点类型为tnode,指示结点的指针类型为tree。每个结点中有存放(字符型)数据的字段data,有指示其第一个孩子结点的指针firstson及指示其下一个兄弟结点的指针nextbrother。说明如下:

 
  1. struct tnode { //树结构结点类型
  2. struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
  3. char data; // 数据字段
  4. };
  5. typedef struct tnode * tree; // 树结构指针类型

编程要求

请在右侧编辑器的命名空间内填写相关代码,实现按层次遍历输出一个森林中每个结点的值及其对应的层次数。 若题目有其它要求,应当将题目要求的结果在solve函数内通过返回或引用的形式传递参数。

测试说明

平台会对你编写的代码进行测试:

 
  1. 函数说明:
  2. void solve(tree t);
  3. 参数 t 为森林的第一颗树的根节点
  4. 右侧数据框说明:
  5. 测试输入:
  6. 一个字符串表示树或森林的广义表形式字符串
  7. 实际输出:
  8. 你需要在函数内输出 n 行,每行一个字符 ci 和一个整数 li,依次为按层次遍历森林时访问的节点值和节点层数
  9. 结构体说明:
  10. struct tnode { //树结构结点类型
  11. struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
  12. char data; // 数据字段
  13. };
  14. typedef struct tnode * tree; // 树结构指针类型
  15. 库函数说明:
  16. void display_tree(char * s, bitre & t);
  17. 第一行输出字符串 s:
  18. 第二行输出树或森林 t 的广义表形式
  19. 库函数详细可查看右侧头文件 "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关:森林的广义表形式

任务描述

本关任务:输出一个森林的广义表形式。

相关知识

实验目的

  1. 掌握树和森林的二叉链表表示方法;
  2. 掌握树和二叉树的结构及算法之间的对应关系;
  3. 掌握树的两种遍历算法及其应用。

树和森林也是软件设计中较为常用的结构,其基本运算也是遍历运算。由于其存储结构主要采用二叉链表存储形式,因此其运算也基于二叉树的运算。本次实验需要加深对树的存储结构,尤其是二叉链表存储结构的理解,掌握树和二叉树之间的对应关系,熟练掌握树的遍历算法及其应用。

实验任务

说明:为使实验程序简洁直观,下面的部分实验程序中的一些功能实现仍以调用库函数程序"trees.h"中的函数的形式给出,并假设该库函数中定义了树指针和结点类型分别为tree和tnode,以及部分常用运算,例如构建树(森林)、以某种方式显示树和森林等。各运算的名称较为直观,因而易于理解。

实验说明

树的存储结构及类型描述

在实验中,树和森林采用的是孩子-兄弟链表表示法(即二叉链表表示法),其结点类型为tnode,指示结点的指针类型为tree。每个结点中有存放(字符型)数据的字段data,有指示其第一个孩子结点的指针firstson及指示其下一个兄弟结点的指针nextbrother。说明如下:

 
  1. struct tnode { //树结构结点类型
  2. struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
  3. char data; // 数据字段
  4. };
  5. typedef struct tnode * tree; // 树结构指针类型

编程要求

请在右侧编辑器的命名空间内填写相关代码,实现输出一个森林的广义表形式。 若题目有其它要求,应当将题目要求的结果在solve函数内通过返回或引用的形式传递参数。

测试说明

平台会对你编写的代码进行测试:

 
  1. 函数说明:
  2. string solve(tree t);
  3. 参数 t 为森林的第一颗树的根节点
  4. 返回一个字符串表示森林的广义表形式字符串
  5. 右侧数据框说明:
  6. 测试输入:
  7. 一个字符串表示树或森林的广义表形式字符串
  8. 实际输出:
  9. 输出你返回的字符串
  10. 结构体说明:
  11. struct tnode { //树结构结点类型
  12. struct tnode *firstson, *nextbrother; // 指示第一个孩子和下一个兄弟的指针
  13. char data; // 数据字段
  14. };
  15. typedef struct tnode * tree; // 树结构指针类型
  16. 库函数说明:
  17. void display_tree(char * s, bitre & t);
  18. 第一行输出字符串 s:
  19. 第二行输出树或森林 t 的广义表形式
  20. 库函数详细可查看右侧头文件 "trees.h"

开始你的任务吧,祝你成功!

#include "trees.h"   // 引用库函数文件
namespace exa {     //请在命名空间内编写代码,否则后果自负

string solve(tree t)
{
    string ans;
    ans += '(';
    ans += dfs(t);
    ans += ')';
    return ans;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值