二叉树结点染色问题 实验报告
实验报告二叉树
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 表达式树
表达式树是一种用于表示数学表达式的二叉树,它的叶节点是操作数,而非叶节点是操作符。通过对表达式树的遍历,可以实现对表达式的求值。
二叉树实验报告
实验中完成: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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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来构造不同的二叉树,