二叉树结点染色问题 实验报告

合集下载

实验报告二叉树

实验报告二叉树
访问右子树}void midOrder(struct btnode *bt){判定树是不是为空递归遍历左子树输出根结点数data递归遍历右子树}void midOrder1(struct btnode *bt){概念栈,结点参数pWhile(栈或p是不是为空){While(p!=null){将根结点压栈遍历左子树}提取栈顶元素值输出根结点数data栈顶元素出栈访问右子树}void postOrder(struct btnode *bt){判定树是不是为空递归遍历左子树
struct btnode *Lchild;struct btnode *Rchild;};struct btnode *createbt(struct btnode *bt )//先序成立二叉树{char c;c=getchar();if(c==' ')//若是输入为空,那么子树为空{bt=NULL;}else{if(!(bt=(struct btnode *)malloc(sizeof(struct btnode))))//查验bt空间分派是不是成功 printf("error!");bt->data=c;bt->Lchild=createbt(bt->Lchild);//递归成立左子树bt->Rchild=createbt(bt->Rchild); //递归成立右子树}return(bt);

数据结构上机实验报告(二叉树染色问题)

数据结构上机实验报告(二叉树染色问题)

数据结构上机实验报告题目:二叉树染色问题

学生姓名:

学生学号:

学院名称:计算机学院

专业:计算机科学与技术

时间:

目录第一章,需求分析3

1.1 原题描述3

1.2 详细问题的解决方案3

1.2.1 解决方案要求3

1.2.2 各个环节功能要求3

第二章,概要设计5

2.1 抽象数据类型5

2.2 主要算法描述5

2.3 算法分析7

第三章,详细设计8

3.1 程序代码8

第四章,调试分析10

第五章,测试分析11

第六章,未来展望与思考12

第一章需求分析

1.1 原题描述

一棵二叉树可以按照如下规则表示成一个由0、1、2组成的字符序列,我们称之为“二叉树序列S”:

例如,下图所表示的二叉树可以用二叉树序列S=21200110来表示

现在要对一棵二叉树的节点进行染色。每个节点可以被染成红色、绿色或蓝色。并且,一个节点与其子节点的颜色必须不同,如果该节点有两个子节点,那么这两个子节点的颜色也必须不相同。给定一棵二叉树的二叉树序列,请求出这棵树中最多和最少有多少个点能够被染成绿色。

1.2详细问题的解决方案

1.2.1 解决方案要求

输入参数:

输入数据由多组数据组成。

每组数据仅有一行,不超过10000个字符,表示一个二叉树序列。

输出参数:

对于每组输入数据,输出仅一行包含两个整数,依次表示最多和最少有多少个点能够被染成绿色。

1.2.2 参考样例

Sample Input

1122002010

Sample Output

5 2

1.2.3 各个环节功能要求

表1-2.1环节功能

函数功能注意条件及限制规则

CreatBitree() 先序建立二叉树字符’2’字符’1’字符’0’三种

数据结构二叉树的实验报告

数据结构二叉树的实验报告

数据结构二叉树的实验报告

数据结构二叉树的实验报告

一、引言

数据结构是计算机科学中非常重要的一个领域,它研究如何组织和存储数据以便高效地访问和操作。二叉树是数据结构中常见且重要的一种,它具有良好的灵活性和高效性,被广泛应用于各种领域。本实验旨在通过实际操作和观察,深入了解二叉树的特性和应用。

二、实验目的

1. 理解二叉树的基本概念和特性;

2. 掌握二叉树的创建、遍历和查找等基本操作;

3. 通过实验验证二叉树的性能和效果。

三、实验过程

1. 二叉树的创建

在实验中,我们首先需要创建一个二叉树。通过输入一系列数据,我们可以按照特定的规则构建一棵二叉树。例如,可以按照从小到大或从大到小的顺序将数据插入到二叉树中,以保证树的有序性。

2. 二叉树的遍历

二叉树的遍历是指按照一定的次序访问二叉树中的所有节点。常见的遍历方式有前序遍历、中序遍历和后序遍历。前序遍历是先访问根节点,然后再依次遍历左子树和右子树;中序遍历是先遍历左子树,然后访问根节点,最后再遍历右子树;后序遍历是先遍历左子树,然后遍历右子树,最后访问根节点。

3. 二叉树的查找

二叉树的查找是指在二叉树中寻找指定的节点。常见的查找方式有深度优先

搜索和广度优先搜索。深度优先搜索是从根节点开始,沿着左子树一直向下搜索,直到找到目标节点或者到达叶子节点;广度优先搜索是从根节点开始,逐

层遍历二叉树,直到找到目标节点或者遍历完所有节点。

四、实验结果

通过实验,我们可以观察到二叉树的特性和性能。在创建二叉树时,如果按照

有序的方式插入数据,可以得到一棵平衡二叉树,其查找效率较高。而如果按

[精品]【数据结构】二叉树实验报告

[精品]【数据结构】二叉树实验报告

[精品]【数据结构】二叉树实验报告二叉树实验报告

一、实验目的:

1.掌握二叉树的基本操作;

2.理解二叉树的性质;

3.熟悉二叉树的广度优先遍历和深度优先遍历算法。

二、实验原理:

1.二叉树是一种树形结构,由n(n>=0)个节点组成;

2.每个节点最多有两个子节点,称为左子节点和右子节点;

3.二叉树的遍历分为四种方式:前序遍历、中序遍历、后序遍历和层次遍历。

三、实验环境:

1.编程语言:C++;

2.编译器:Dev-C++。

四、实验内容:

1.定义二叉树节点结构体:

struct BinaryTreeNode

{

int data; // 节点数据

BinaryTreeNode *leftChild; // 左子节点指针

BinaryTreeNode *rightChild; // 右子节点指针

};

2.初始化二叉树:

queue<BinaryTreeNode *> q; // 使用队列存储节点

q.push(root);

int i = 1; // 创建子节点

while (!q.empty() && i < length)

{

BinaryTreeNode *node = q.front();

q.pop();

if (data[i] != -1) // 创建左子节点 {

BinaryTreeNode *leftChild = new BinaryTreeNode;

leftChild->data = data[i];

leftChild->leftChild = nullptr;

leftChild->rightChild = nullptr;

二叉树结点染色问题 实验报告

二叉树结点染色问题 实验报告

(一)需求和规格说明

一棵二叉树可以按照如下规则表示成一个由0、1、2组成的字符序列,我们称之为“二叉树序列S”:

例如,下图所表示的二叉树可以用二叉树序列S=21200110来表示。

任务是要对一棵二叉树的节点进行染色。每个节点可以被染成红色、绿色或蓝色。并且,一个节点与其子节点的颜色必须不同,如果该节点有两个子节点,那么这两个子节点的颜色也必须不相同。给定一棵二叉树的二叉树序列,请求出这棵树中最多和最少有多少个点能够被染成绿色。

(二)设计

分析过程:

这是一道二叉树的染色问题,求染成绿色的最大最小情况,从本质上

看,这是一道动态规划问题。为了方便直观起见,代码开始时用先

enum Color{

nocolor = 0,

green = 1,

red = 2,

blue = 3

};定义了不同的颜色。

举个简单的例子,如下图所示:

将整个二叉树划分成三个部分:根节点、左子树、右子树。由于有约束条件,所以这三个部分存在着互相限制作用如下:

1. 二叉树的根节点与左子树的根节点颜色不同;

2.二叉树的根节点与右子树的根节点颜色不同;

3.左子树根节点与右子树根节点颜色不同。

显然,上述的三个限制表示的是标号为1、2、3三个点之间的互相关系。除此以外,左子树中的点与右子树中的点没有任何直接的限制关系!也就是说,如果我们事先确定了上述二叉树中标号为1、2、3的三个点的颜色,那么接下来,对左子树染色和对右子树染色将变成两个互不干扰的子问题,左子树最值与右子树最值不影响,可以分开求解。

【互不干扰,可以分开求解】

如此一来,通过将三点染色,我们就可以把二叉树分成左右两个子树,整个问题被分解成两个较小规模的子问题。

二叉树实验报告

二叉树实验报告

二叉树实验报告

二叉树是数据结构中最常见且重要的一种类型。它由节点组成,每个节点最多有两个子节点,分别称为左节点和右节点。通过连接这些节点,可以构建一个有序且具有层次结构的树形结构。本实验报告将介绍二叉树的概念、特点以及常见的操作,同时介绍二叉树在实际应用中的一些典型案例。

一、二叉树的定义和特点

二叉树是一种树形结构,它的每个节点至多只有两个子节点。它的定义可以使用递归的方式进行描述:二叉树要么是一棵空树,要么由根节点和两棵分别称为左子树和右子树的二叉树组成。二叉树的特点是每个节点最多只有两个子节点。

二、二叉树的创建和操作

1.创建二叉树:二叉树可以通过两种方式来创建,一种是使用树的节点类来手动构建二叉树;另一种是通过给定的节点值列表,使用递归的方式构建二叉树。

2.遍历二叉树:二叉树的遍历有三种方式,分别是前序遍历、中序遍历和后序遍历。

a.前序遍历:先遍历根节点,再遍历左子树,最后遍历右子树。

b.中序遍历:先遍历左子树,再遍历根节点,最后遍历右子树。

c.后序遍历:先遍历左子树,再遍历右子树,最后遍历根节点。

3.查找节点:可以根据节点的值或者位置来查找二叉树中的节点。

4.插入节点:可以通过递归的方式在指定位置上插入一个新节点。

5.删除节点:可以通过递归的方式删除二叉树中的指定节点。

三、二叉树的应用案例

二叉树在实际应用中有很多重要的用途,下面介绍几个典型的案例。

1.表示文件系统结构:文件系统可以使用二叉树来进行表示,每个文件或文件夹都可以看作是树中一个节点,节点之间的父子关系可以通过左右子树建立连接。

数据结构二叉树实验报告

数据结构二叉树实验报告

数据结构二叉树实验报告

二叉树是一种常用的数据结构,它在计算机科学中有着广泛的应用。本文将介绍二叉树的定义、基本操作以及一些常见的应用场景。

一、二叉树的定义和基本操作

二叉树是一种特殊的树形结构,它的每个节点最多有两个子节点。一个节点的左子节点称为左子树,右子节点称为右子树。二叉树的示意图如下:

```

A

/ \

B C

/ \

D E

```

在二叉树中,每个节点可以有零个、一个或两个子节点。如果一个节点没有子节点,我们称之为叶子节点。在上面的示例中,节点 D 和 E 是叶子节点。

二叉树的基本操作包括插入节点、删除节点、查找节点和遍历节点。插入节点操作可以将一个新节点插入到二叉树中的合适位置。删除节点操作可以将一个指定的节点从二叉树中删除。查找节点操作可以在二叉树中查找指定的节点。遍历节点操作可以按照一定的顺序遍历二叉树中的所有节点。

二、二叉树的应用场景

二叉树在计算机科学中有着广泛的应用。下面将介绍一些常见的应用场景。

1. 二叉搜索树

二叉搜索树是一种特殊的二叉树,它的每个节点的值都大于其左子树中的节点

的值,小于其右子树中的节点的值。二叉搜索树可以用来实现快速的查找、插

入和删除操作。它在数据库索引、字典等场景中有着重要的应用。

2. 堆

堆是一种特殊的二叉树,它的每个节点的值都大于或小于其子节点的值。堆可

以用来实现优先队列,它在任务调度、操作系统中的内存管理等场景中有着重

要的应用。

3. 表达式树

表达式树是一种用来表示数学表达式的二叉树。在表达式树中,每个节点可以

是操作符或操作数。表达式树可以用来实现数学表达式的计算,它在编译器、

二叉树 实验报告

二叉树 实验报告

二叉树实验报告

二叉树实验报告

引言:

二叉树是一种常见的数据结构,它由节点和边组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。在本次实验中,我们将探索二叉树的基本概念、特性以及应用。

一、二叉树的定义与性质

1.1 二叉树的定义

二叉树是一种递归定义的数据结构,它可以为空,或者由一个根节点和两个二叉树组成,分别称为左子树和右子树。

1.2 二叉树的性质

(1)每个节点最多有两个子节点,分别称为左子节点和右子节点。

(2)左子树和右子树也是二叉树。

(3)二叉树的子树之间没有关联性,它们是相互独立的。

二、二叉树的遍历方式

2.1 前序遍历

前序遍历是指先访问根节点,然后按照先左后右的顺序遍历左子树和右子树。

2.2 中序遍历

中序遍历是指先遍历左子树,然后访问根节点,最后遍历右子树。

2.3 后序遍历

后序遍历是指先遍历左子树,然后遍历右子树,最后访问根节点。

2.4 层次遍历

层次遍历是指按照从上到下、从左到右的顺序遍历二叉树的每个节点。

三、二叉树的应用

3.1 二叉搜索树

二叉搜索树是一种特殊的二叉树,它的每个节点的值大于其左子树的所有节点的值,小于其右子树的所有节点的值。这种特性使得二叉搜索树可以高效地进行查找、插入和删除操作。

3.2 哈夫曼树

哈夫曼树是一种带权路径长度最短的二叉树,它常用于数据压缩中。哈夫曼树的构建过程是通过贪心算法,将权值较小的节点放在离根节点较远的位置,从而实现最优编码。

3.3 表达式树

表达式树是一种用于表示数学表达式的二叉树,它的叶节点是操作数,而非叶节点是操作符。通过对表达式树的遍历,可以实现对表达式的求值。

二叉树实验报告

二叉树实验报告
实验前完成:1-5小题。
实验中完成:7-9小题。
实验后完wk.baidu.com:
(1)输出所有叶子结点到根结点的路径。
(2)如果将二叉树中左分支标为0,右分支标为1,从叶子结点到根结点的路径由所经过的左、右分支组成。取左右分支的上0和1就构成了叶子结点的二进制编码。请输出二叉树中所有叶子结点的编码。
实验解答:
1.二叉树的二叉链式存储结构的结点结构体定义
3.实现二叉树的先序遍历算法、中序遍历算法和后序遍历算法;
4.利用某遍历算法实现计算二叉树中叶子结点、度为2的结点和度为1的结点的个数。
5.求二叉树中结点个数。
6.求二叉树的深度。
7.设计一个算法,求二叉树中指定结点x的层数。
8.设计一算法,求先序遍历序列中第k个结点的左右孩子。
9.求结点x的所有祖先。
申请了一个数组用来存贮x的祖先
voidBiTree::SearchAllParents(NodeType*p,ElemTypex,ElemTypepath[],intm)
{
inti;
if(p!=NULL)
{
if(p->data==x)
{
for(i=m-1;i>=0;i--)
cout<<path[i]<<" ";
采用了递归
分别采用了中序遍历,先序遍历和后序遍历

数据结构二叉树实验报告总结

数据结构二叉树实验报告总结

数据结构二叉树实验报告总结

一、实验目的

本次实验的主要目的是通过对二叉树的学习和实践,掌握二叉树的基本概念、性质和遍历方式,加深对数据结构中树形结构的理解。

二、实验内容

1. 二叉树的基本概念和性质

在本次实验中,我们首先学习了二叉树的基本概念和性质。其中,二叉树是由节点组成的有限集合,并且每个节点最多有两个子节点。同时,我们还学习了二叉树的高度、深度、层数等概念。

2. 二叉树的遍历方式

在了解了二叉树的基本概念和性质之后,我们开始学习如何遍历一个二叉树。在本次实验中,我们主要学习了三种遍历方式:前序遍历、中序遍历和后序遍历。其中,前序遍历指先访问节点自身再访问左右子节点;中序遍历指先访问左子节点再访问自身和右子节点;后序遍历指先访问左右子节点再访问自身。

3. 二叉搜索树

除了以上内容之外,在本次实验中我们还学习了一种特殊的二叉树——二叉搜索树。二叉搜索树是一种特殊的二叉树,它的每个节点都满

足左子节点小于该节点,右子节点大于该节点的性质。由于这个性质,二叉搜索树可以被用来进行快速查找、排序等操作。

三、实验过程

1. 实现二叉树的遍历方式

为了更好地理解和掌握二叉树的遍历方式,我们首先在编程环境中实

现了前序遍历、中序遍历和后序遍历。在代码编写过程中,我们需要

考虑如何递归地访问每个节点,并且需要注意访问顺序。

2. 实现二叉搜索树

为了更好地理解和掌握二叉搜索树的特性和操作,我们在编程环境中

实现了一个简单的二叉搜索树。在代码编写过程中,我们需要考虑如

何插入新节点、删除指定节点以及查找目标节点等操作。

3. 实验结果分析

树染色方案数

树染色方案数

树染色方案数

引言

树是一种重要的数据结构,在计算机科学中被广泛应用。树染色是一种对树的节点进行标记或着色的操作,用来表示不同节点之间的关系或属性。树染色方案数是指对于给定的树,存在多少种不同的染色方案。本文将探讨树染色方案数的计算方法和相关问题。

不同类型的树

在开始讨论树染色方案数之前,先介绍一些常见的树结构。根据树的性质,可以将树分为以下几种类型:

1.二叉树:每个节点最多有两个子节点,分别称为左子节点和右子节点。

2.平衡树:左右子树的高度差不超过1的二叉树。

3.二叉搜索树:对于任意节点,其左子树中的所有节点都小于该节点,右子树

中的所有节点都大于该节点。

4.红黑树:一种自平衡的二叉搜索树,具有特定的性质保证了树的平衡性。

5.无向树:没有指定根节点的树。

以上只是一些常见的树结构,在实际应用中还有很多其他类型的树。

树染色的定义

树染色是对树的节点进行标记或着色的操作。染色可以用数字、颜色等方式表示。假设有一棵树T,设T的节点数为N,则树T的任意节点k的染色方案数为Ck,树T的染色方案数为C。树的染色方案数可以表示为:

C = ∑Ck (k = 0 to N)

二叉树的染色方案数

首先,我们探讨二叉树的染色方案数。假设二叉树的根节点为A,左子树为B,右子树为C。此时的染色方案数可以表示为:

C = Cb * Cc

其中Cb和Cc分别为左子树和右子树的染色方案数。根据这个递推关系,我们可以使用动态规划的方法来计算二叉树的染色方案数。

平衡树的染色方案数

接下来,我们讨论平衡树的染色方案数。对于平衡树来说,染色方案数的计算和二叉树类似。假设平衡树的根节点为A,左子树为B,右子树为C。此时的染色方案数可以表示为:

二叉树实验报告

二叉树实验报告

二叉树实验报告

1. 引言

二叉树是一种常用的数据结构,广泛应用于计算机科学和信息技术领域。本实验旨在通过对二叉树的理解和实现,加深对数据结构与算法的认识和应用能力。本报告将介绍二叉树的定义、基本操作以及实验过程中的设计和实现。

2. 二叉树的定义

二叉树是一个有序树,其每个节点最多有两个子节点。树的左子节点和右子节点被称为二叉树的左子树和右子树。

3. 二叉树的基本操作

3.1 二叉树的创建

在实验中,我们通过定义一个二叉树的节点结构来创建一个二叉树。节点结构包含一个数据域和左右指针,用于指向左右子节点。创建二叉树的过程可以通过递归或者迭代的方式来完成。

3.2 二叉树的插入和删除

二叉树的插入操作是将新节点插入到树中的合适位置。插入时需要考虑保持二叉树的有序性。删除操作是将指定节点从树中删除,并保持二叉树的有序性。在实验中,我们可以使用递归或者循环的方式实现这些操作。

3.3 二叉树的遍历

二叉树的遍历是指按照某种次序访问二叉树的所有节点。常见的遍历方式包括前序遍历、中序遍历和后序遍历。前序遍历先访问根节点,然后按照左孩子-右孩子的顺序递归遍历左右子树。中序遍历按照左孩子-根节点-右孩子的顺序递归遍历左右子树。后序遍历按照左孩子-右孩子-根节点的顺序递归遍历左右子树。

3.4 二叉树的查找

查找操作是指在二叉树中查找指定的值。可以通过递归或者循环的方式实现二叉树的查找操作。基本思路是从根节点开始,通过比较节点的值和目标值的大小关系,逐步向左子树或者右子树进行查找,直到找到目标节点或者遍历到叶子节点。

4. 实验设计和实现

数据结构实验报告-树(二叉树)

数据结构实验报告-树(二叉树)

实验5:树(二叉树)(采用二叉链表存储)

一、实验项目名称

二叉树及其应用

二、实验目的

熟悉二叉树的存储结构的特性以及二叉树的基本操作。

三、实验基本原理

之前我们都是学习的线性结构,这次我们就开始学习非线性结构——树。线性结构中结点间具有唯一前驱、唯一后继关系,而非线性结构中结点的前驱、后继的关系并不具有唯一性。在树结构中,节点间关系是前驱唯一而后继不唯一,即结点之间是一对多的关系。直观地看,树结构是具有分支关系的结构(其分叉、分层的特征类似于自然界中的树)。

四、主要仪器设备及耗材

Window 11、Dev-C++5.11

五、实验步骤

1.导入库和预定义

2.创建二叉树

3.前序遍历

4.中序遍历

5.后序遍历

6.总结点数

7.叶子节点数

8.树的深度

9.树根到叶子的最长路径

10.交换所有节点的左右子女

11.顺序存储

12.显示顺序存储

13.测试函数和主函数

对二叉树的每一个操作写测试函数,然后在主函数用while+switch-case的方式实现一个带菜单的简易测试程序,代码见“实验完整代码”。

实验完整代码:

#include <bits/stdc++.h>

using namespace std;

#define MAX_TREE_SIZE 100

typedef char ElemType;

ElemType SqBiTree[MAX_TREE_SIZE];

struct BiTNode

{

ElemType data;

BiTNode *l,*r;

}*T;

void createBiTree(BiTNode *&T)

二叉树操作实验报告

二叉树操作实验报告

二叉树操作实验报告

一、实验背景

二叉树是一种常用的数据结构,它由节点和连接节点的边组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。在二叉树的操作中,常用的操作包括创建二叉树、插入节点、删除节点、查找节点、遍历等。本次实验旨在通过对二叉树的操作,加强对二叉树数据结构的理解,并熟练掌握其操作方法。

二、实验目的

1.掌握二叉树的创建方法,能够编写代码创建一个二叉树;

2.了解二叉树的插入节点操作,掌握节点的插入方法;

3.掌握二叉树的删除节点操作,了解节点删除的细节和方法;

4.熟练掌握二叉树的查找节点操作;

5.掌握二叉树的遍历方法,能够实现对二叉树的前序、中序、后序、层次遍历。

三、实验原理

1.二叉树的创建方法:通过递归的方式,先创建根节点,再依次创建左子树和右子树;

2.二叉树的插入节点操作:从根节点开始,根据节点值的大小关系,将待插入节点放到适当的位置;

3.二叉树的删除节点操作:首先查找待删除的节点,然后根据其子节点的情况,进行相应的删除处理;

4.二叉树的查找节点操作:从根节点开始遍历,根据节点值的大小关系,在左

子树或右子树中继续查找,直到找到目标节点或遍历到叶子节点;

5.二叉树的遍历方法:前序遍历先访问根节点,再遍历左子树和右子树;中序遍历先遍历左子树,再访问根节点和右子树;后序遍历先遍历左子树和右子树,再访问根节点;层次遍历按层次逐个访问节点。

四、实验过程

1.创建二叉树:

首先,定义二叉树的节点类,包含节点值和左右子节点;然后,通过递归的方式创建根节点、左子树和右子树。

2.插入节点:

二叉树实验报告

二叉树实验报告

二叉树实验报告

实验题目:实验九——二叉树实验

算法设计(3)

问题分析:

1、题目要求:编写算法交换二叉树中所有结点的左右子树

2、设计思路:首先定义一个二叉树的数据类型,使用先序遍历建立该二叉树,遍历二叉树,设计左右子树交换的函数,再次遍历交换之后的二叉树,与先前二叉树进行比较。遍历算法与交换算法使用递归设计更加简洁。

3、测试数据:

A、输入:1 2 4 0 0 5 0 0 3 0 0

交换前中序遍历:4 2 5 1 3

交换后中序遍历:3 1 5 2 4

交换前:交换后:

B、输入:3 7 11 0 0 18 17 0 0 19 0 0 6 13 0 0 16 0 0

交换前中序遍历:11 7 17 18 19 3 13 6 16

交换后中序遍历:16 6 13 3 19 18 17 7 11

概要设计:

1、为了实现上述功能:①构造一个空的二叉树;②应用先序遍历输入,建立二叉树;③中序遍历二叉树;④调用左右子树交换函数;

⑤中序遍历交换过后的二叉树。

2、本程序包括4个函数:

①主函数main()

②先序遍历二叉树建立函数creat_bt()

③中序遍历二叉树函数inorder()

④左右子树交换函数 exchange()

各函数间关系如下:

详细设计:

1、结点类型

typedef struct binode //定义二叉树

{

int data; //数据域

struct binode *lchild,*rchild; //左孩子、右孩子

}binode,*bitree;

2、各函数操作

① 先序遍历建二叉树函数

bitree creat_bt()

实验二 二叉树实验报告

实验二  二叉树实验报告

河南农业大学

数据结构实验报告

专业/班级实验时间地点姓名

实验二

一、实验目的

学习上操作树的各种基本操作,重点掌握以下操作

创建、遍历、显示二叉树,通过二叉树的基本操作,掌握树结构的处理方法。并以此为基本思想延伸树的应用。

二、问题描述

1.建立一棵二叉树,并对其进行遍历(先序、中序、后序),打印输出遍历结果。

2.按凹入表形式横向打印二叉树结构,即二叉树的根在屏幕的最左边,二叉树的左子树在屏幕的下边,二叉树的右子树在屏幕的上边。

3.按凹入表形式打印树形结构。

三、数据结构设计

1.对于二叉树来说,每个节点最多有两个孩子,采用链式方式存储,每个结点的值域有数据域(data),两个指针域左海子(lchild)右孩子(rchild),该结点的深度(degree)。但是如果打印二叉树的话则每个节点的深度规定根节点的深度为0,其孩子结点的深度为1并且兄弟节点的深度是相同的,则二叉树结点的结构为

data lchild rchild degree

2.对与树使用孩子---兄弟的数据结构即每个结点有两个域为指向孩子节点(firstchild)和下个兄弟域(nextsibling)firstchild nextsibling

三.功能设计

1.二叉树的算法思想

(1)对二叉树的遍历用递归思想,改变访问根节点的顺序来实施遍历。

(2)如果打印二叉树

则需要构造完全二叉树,若空结点,用相同的变量的代替。遍历的时候是先遍历右子树的中序遍历。

建立的时候先建立一个根结点,若不是空的话,则为其孩子节点,重复操作直到建立完整的二叉树。

(3)打印树

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(一)需求和规格说明

一棵二叉树可以按照如下规则表示成一个由0、1、2组成的字符序列,我们称之为“二叉树序列S”:

例如,下图所表示的二叉树可以用二叉树序列S=21200110来表示。

任务是要对一棵二叉树的节点进行染色。每个节点可以被染成红色、绿色或蓝色。并且,一个节点与其子节点的颜色必须不同,如果该节点有两个子节点,那么这两个子节点的颜色也必须不相同。给定一棵二叉树的二叉树序列,请求出这棵树中最多和最少有多少个点能够被染成绿色。

(二)设计

分析过程:

这是一道二叉树的染色问题,求染成绿色的最大最小情况,从本质上

看,这是一道动态规划问题。为了方便直观起见,代码开始时用先

enum Color{

nocolor = 0,

green = 1,

red = 2,

blue = 3

};定义了不同的颜色。

举个简单的例子,如下图所示:

将整个二叉树划分成三个部分:根节点、左子树、右子树。由于有约束条件,所以这三个部分存在着互相限制作用如下:

1. 二叉树的根节点与左子树的根节点颜色不同;

2.二叉树的根节点与右子树的根节点颜色不同;

3.左子树根节点与右子树根节点颜色不同。

显然,上述的三个限制表示的是标号为1、2、3三个点之间的互相关系。除此以外,左子树中的点与右子树中的点没有任何直接的限制关系!也就是说,如果我们事先确定了上述二叉树中标号为1、2、3的三个点的颜色,那么接下来,对左子树染色和对右子树染色将变成两个互不干扰的子问题,左子树最值与右子树最值不影响,可以分开求解。

【互不干扰,可以分开求解】

如此一来,通过将三点染色,我们就可以把二叉树分成左右两个子树,整个问题被分解成两个较小规模的子问题。

算法设计:

如图二所示,将二叉树划分成三部分,给标号为1、2、3三个点先染色后,将依次处理左子树,右子树。

在求解时,有以下2个问题:

(1)染色的任意性

标号为1、2、3的三个点的颜色并不一定固定依次是红、绿、蓝。我

们需要对所有染色情况进行枚举,并对每个染色情况进行左、右子树的分

别处理。同样,当根节点只有一个子节点时,我们也要枚举此时的染色方

案。

(2)根节点的颜色已确定

由于2号点已经染色,所以,在递归处理左子树时,问题就转化成“根

节点颜色已确定,求满足约束条件的最多(最小)染色方案”。这个转

化后的子问题与原问题略有差异:原问题中根节点可以任意染色,而转化

后的子问题中根节点的颜色是固定的。

为了便于递归调用相同的处理操作,我们必须保证所有问题的条件与

求解目标的统一!于是,有必要将原问题稍做修改:事先求出整个二叉树

根节点为红色、绿色或蓝色情况下问题的解(这就与子问题是同一类型

了),然后取这三个解中的最大(或最小)值,即得到原问题的解。

分析至此,我们已经得出了解决问题的大致方法:

将原问题转化成“根节点颜色确定,求染色最值方案”;

枚举根节点的左节点与右节点(如果存在)的颜色,同时满足约束条

件;

对每种染色方案,递归处理求左、右两子树。

给二叉树上所有节点标号,从1~N;

用son记录二叉树的构造关系, Son(i,0)和Son(i,1)分别表示编号

是i的节点,其左右两个子节点的编号(如果不存在,则用-1表示)。例

如在上图中,我们有Son(1,0)=2,Son(1,1)=3。

用F(i,j)表示一个子问题一个子问题可以由两个参数来描述:根节

点编号i,根节点颜色j。 F(i , j)表示:以编号是i、颜色是j的节点

为根节点的子树,在满足约束条件的情况下染色,绿色节点最多(最少)

有多少个。按照先前所设计的算法,可以大致得出如下式:

0 i == -1

F(i,j) = F(son(i,0), j1)+F (son(i,1),j2) i<>-1 j<>green F(son(i,0),j1)+ F(son(i,1),j2+1 i<>-1 j == green

根据我们的分析,算法会有重复操作,多次计算F(i,j)的值。那么,

我们不妨造一个表将F(i,j)保存起来,这样就能有效避免重复计算了。

类型成员名描述

结构体名成员类

node 属性int ChildNum 存储当前结点拥有的孩

子值,

Color color 存储当前结点的颜色

类名成员类

类型成员名描述employee 属性int length S的长度

node

的动

态数

tree 存储tree的结点方法TREE() 构建tree

void Preorder(int

i) 以第i结点为根结点进行先序遍历

int Son(int i ,bool

right)返回第i个结点的孩子,第二个参数表示返回是左孩子还是右孩子,若没有,返回-1

int GreenMax() 求最多有多少个绿色结

点并返回

int GreenMin() 求最少有多少个绿色结

点并返回

int Max(int

i,Color j,int

mermory[]) 求以第i个结点在颜色j下为根结点时最多有多少个绿色结点并返回

int Min(int

i,Color j,int

mermory[]) 求以第i个结点在颜色j下为根结点时最少有多少个绿色结点并返回

时间复杂度

从一棵树的根结点开始,依次求解结点的子树最多/少有多少的结点可以染成绿色,若树有n个结点,那么复杂度为O(n)。

(三)用户手册

用户通过修改TREE.TRE文本文档中二叉序列S来构造不同的二叉树,

相关文档
最新文档