二叉树的基本操作实验
数据结构平衡二叉树的操作演示
平衡二叉树操作的演示
1.需求分析
本程序是利用平衡二叉树,实现动态查找表的基本功能:创建表,查找、插入、删除。具体功能:
(1)初始,平衡二叉树为空树,操作界面给出创建、查找、插入、删除、合并、分裂六种操作供选择。每种操作均提示输入关键字。每次插入或删除一个结点后,更
新平衡二叉树的显示。
(2)平衡二叉树的显示采用凹入表现形式。
(3)合并两棵平衡二叉树。
(4)把一棵二叉树分裂为两棵平衡二叉树,使得在一棵树中的所有关键字都小于或等于x,另一棵树中的任一关键字都大于x。
如下图:
2.概要设计
平衡二叉树是在构造二叉排序树的过程中,每当插入一个新结点时,首先检查是否因插入新结点而破坏了二叉排序树的平衡性,若是则找出其中的最小不平衡子树,在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。
具体步骤:
(1)每当插入一个新结点,从该结点开始向上计算各结点的平衡因子,即计算该结点的祖先结点的平衡因子,若该结点的祖先结点的平衡因子的绝对值不超过1,则平衡二叉树没有失去平衡,继续插入结点;
(2)若插入结点的某祖先结点的平衡因子的绝对值大于1,则找出其中最小不平衡子树的根结点;
(3)判断新插入的结点与最小不平衡子树的根结点个关系,确定是那种类型的调整;(4)如果是LL型或RR型,只需应用扁担原理旋转一次,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;如果是LR型或RL型,则需应用扁担原理旋转两次,第一次最小不平衡子树的根结点先不动,调整插入结点所在子树,第二次再调整最小不平衡子树,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;(5)计算调整后的平衡二叉树中各结点的平衡因子,检验是否因为旋转而破坏其他结点的平衡因子,以及调整后平衡二叉树中是否存在平衡因子大于1的结点。
南邮数据结构实验一
实验报告
(2014 / 2015 学年第一学期)
课程名称数据结构
实验名称二叉树基本操作以及哈夫曼编码译码系统实验时间年月日
指导单位
指导教师
学生姓名班级学号
学院(系) 专业
二叉树的基本运算:
一、问题描述
1.设计递归算法,实现二叉树的运算:删除一棵二叉树,求一棵二叉树的高度,求一棵二叉树中叶子节点数,复制一棵二叉树,交换一棵二叉树的左右子树
2.设计算法,自上而下,自左向右即按层次遍历一棵二叉树
3.设计main函数,测试上述每个运算
二、系统分析和概要设计
首先用maketree构造一棵二叉树,然后遍历二叉树,然后交换每个结点的左右子树,接着算出输得高度和叶子节点,最后删除。
三、详细设计
2. 核心算法
建立二叉树的void MakeTree(const T& x,BinaryTree& left,BinaryTree& right)和计算叶子节点的int Size();
3. 算法分析
删除一棵二叉树,求一棵二叉树的高度,求一棵二叉树中叶子节点数,复制一棵二叉树等都是用递归的方法实现。
四、程序代码
流程图
#include
template
struct BTNode
{
BTNode()
{
lChild=rChild=NULL;
}
BTNode(const T &x)
{
element=x;
lChild=rChild=NULL;
}
BTNode(const T &x,BTNode* l,BTNode* r)
{
element=x;
lChild=l;
rChild=r;
}
T element;
BTNode* lChild,* rChild;
数据结构实验五(二叉树的建立及遍历)题目和源程序
实验5:二叉树的建立及遍历
(第十三周星期三7、8节)
一、实验目的
1.学会实现二叉树结点结构和对二叉树的基本操作。
2.掌握对二叉树每种操作的具体实现,学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法。
二、实验要求
1.认真阅读和掌握和本实验相关的教材内容。
2.编写完整程序完成下面的实验内容并上机运行。
3.整理并上交实验报告。
三、实验内容
1.编写程序任意输入二叉树的结点个数和结点值,构造一棵二叉树,采用三种递归遍历算法(前序、中序、后序)对这棵二叉树进行遍历并计算出二叉树的高度。
2 .编写程序生成下面所示的二叉树,并采用中序遍历的非递归算法对此二
叉树进行遍历。
四、思考与提高
1.如何计算二叉链表存储的二叉树中度数为1的结点数?
2.已知有—棵以二叉链表存储的二叉树,root指向根结点,p指向二叉树中任一结点,如何求从根结点到p所指结点之间的路径?
/*----------------------------------------
* 05-1_递归遍历二叉树.cpp -- 递归遍历二叉树的相关操作* 对递归遍历二叉树的每个基本操作都用单独的函数来实现* 水上飘2009年写
----------------------------------------*/
// ds05.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include
typedef char ElemType;
二叉树的基本操作实验报告
二叉树的基本操作实验报告
学号姓名实验日期 2012-12-26
实验室计算机软件技术实验指导教师设备编号 401
实验内容二叉树的基本操作
一实验题目
实现二叉树的基本操作的代码实现
二实验目的
1、掌握二叉树的基本特性
2、掌握二叉树的先序、中序、后序的递归遍历算法
3、通过求二叉树的深度、度为2的结点数和叶子结点数等算法三实习要求
(1)认真阅读书上给出的算法
(2)编写程序并独立调试
四、给出二叉树的抽象数据类型
ADT BinaryTree{
//数据对象D:D是具有相同特性的数据元素的集合。
//数据关系R:
// 若D=Φ,则R=Φ,称BinaryTree为空二叉树;
// 若D?Φ,则R={H},H是如下二元关系;
// (1)在D中存在惟一的称为根的数据元素root,它在关系H下无前驱; // (2)若D-{root}?Φ,则存在D-{root}={D1,Dr},且D1?Dr =Φ; // (3)若D1?Φ,则D1中存在惟一的元素x1,<root,x1>?H,且存在D1上的关系H1 ?H;若Dr?Φ,则Dr中存在惟一的元素xr,<root,xr>?H,且存在上的关系
Hr ?H;H={<root,x1>,<root,xr>,H1,Hr};
// (4)(D1,{H1})是一棵符合本定义的二叉树,称为根的左子树;(Dr,{Hr})是一棵符合本定义的二叉树,称为根的右子树。
//基本操作:
CreateBiTree( &T, definition ) // 初始条件:definition给出二叉树T的定义。
学号后两位-姓名-实验8
实验8 二叉树的基本操作
姓名:
班级:
学号:
一、题目
由数字序列生成二叉树
假设我们有这样的二叉树:
节点的元素(key)是正整数,且互不相同。
错误!未指定书签。可能给出这样一个虚拟的树更有利于理解输入。
是的,我们的输入是上图的先序遍历
即,要求根据1 3 0 2 0 0 4 5 0 0 0这样的输入,
构造出一棵只含有正整数节点的二叉树
【输入】
扩展的二叉树的先序遍历
【输出】
构造的简单树的节点个数
【样例输入】
1 3 0
2 0 0 4 5 0 0 0
【样例输出】
5
二、程序清单
#include<iostream>
using namespace std;
struct btree{
int data;
btree *left,*right;
btree()
{
data=0;
left=NULL;
right=NULL;
}
};
void create(btree *&root)//创建
{
root=new btree();
cin>>root->data;
if(root->data==0)
root=NULL;
else
{
create(root->left);
create(root->right);
}
}
void preorder(btree *&root)//先序遍历
{
if(root!=NULL)
{
cout<<"root->data:"<<root->data<<"\n";
preorder(root->left);
preorder(root->right);
[精品]【数据结构】二叉树实验报告
[精品]【数据结构】二叉树实验报告二叉树实验报告
一、实验目的:
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;
实验二 二叉树的基本操作
实验三二叉树的基本操作
一、实验目的
1、进一步掌握树的结构及非线性特点,递归特点和动态性。
2、掌握二叉树的建立算法。
3、掌握二叉树的三种遍历方法以及基于遍历的几种基本操作。
二、实验内容
1、二叉树的链式存储结构的建立;
2、二叉树的三种遍历算法以及基于遍历的几种操作的实现。
三、实验要求
1、学生用C++/C完成算法设计和程序设计并上机调试通过;
2、撰写实验报告,提供实验测试数据和实验结果;
3、分析算法,要求给出具体的算法分析结果,包括时间复杂度和空间复杂度,并简要给出算法设计小结和心得。
四、实验准备
1、了解树的结构特点及概念、二叉树的概念及结构特点。
2、了解树和二叉树的基本概念和术语。
3、二叉树的三种遍历方法(先序、中序、后序遍历)
先序遍历:若二叉树为空,则空操作,否则
①访问根结点;
②先序遍历左子树;
③先序遍历右子树。
中序遍历:若二叉树为空,则空操作,否则
①中序遍历左子树;
②访问根结点;
③中序遍历右子树。
后序遍历:若二叉树为空,则空操作,否则
①后序遍历左子树;
②后序遍历右子树;
③访问根结点。
4、二叉树的各种存储结构及其适用范围,特别是链式存储结构。
五、实验步骤
1、编程实现二叉树的建立、遍历以及基于遍历的几种基本操作。
(1)采用二叉链表存储结构创建一个二叉树;
(2)用递归方法实现二叉树的三种遍历算法
(3)求二叉树中叶子结点的个数,度为1 的结点个数和度为2 的结点个数;
(4)求二叉树的深度。
六、实验参考代码
#include "iostream.h"
#include "stdio.h"
#include "stdlib.h"
二叉树基本操作--实验报告
实验三
二叉树的基本操作
学院:物理与电子学院
班级:电信1105班
姓名:刘岩
学号:29
一、实验目的
1、熟悉二叉树的基本操作,掌握二叉树的实现以及实际应用。
3、加深对于二叉树的理解,逐步培养解决实际问题的编程能力。
二、实验环境
1台WINDOWS环境的PC机,装有Visual C++ 。
三、实验内容
1、问题描述
现需要编写一套二叉树的操作函数,以便用户能够方便的利用这些函数来实现自己的应用。其中操作函数包括:
1>创建二叉树CreateBTNode(*b,*str):根据二叉树括号表示法的字符串*str
生成对应的链式存储结构。
2>输出二叉树DispBTNode(*b):以括号表示法输出一棵二叉树。
3>查找结点FindNode(*b,x):在二叉树b中寻找data域值为x的结点,并返回
指向该结点的指针。
4>求高度BTNodeDepth(*b):求二叉树b的高度。若二叉树为空,则其高度为0;
否则,其高度等于左子树与右子树中的最大高度加l。
5>求二叉树的结点个数NodesCount(BTNode *b)
6>先序遍历的递归算法:void PreOrder(BTNode *b)
7>中序遍历的递归算法:void InOrder(BTNode *b)
8>后序遍历递归算法:void PostOrder(BTNode *b)
9>层次遍历算法void LevelOrder(BTNode *b)
2、基本要求
实现以上9个函数。
主函数中实现以下功能:
创建下图中的树b
数据结构实验二叉树
实验六:二叉树及其应用
一、实验目的
树是数据结构中应用极为广泛的非线性结构,本单元的实验达到熟悉二叉树的存储结构的特性,以及如何应用树结构解决具体问题。
二、问题描述
首先,掌握二叉树的各种存储结构和熟悉对二叉树的基本操作。其次,以二叉树表示算术表达式的基础上,设计一个十进制的四则运算的计算器。
如算术表达式:a+b*(c-d)-e/f
三、实验要求
如果利用完全二叉树的性质和二叉链表结构建立一棵二叉树,分别计算统计叶子结点的个数。求二叉树的深度。十进制的四则运算的计算器可以接收用户来自键盘的输入。由输入的表达式字符串动态生成算术表达式所对应的二叉树。自动完成求值运算和输出结果。四、实验环境
PC微机
DOS操作系统或Windows 操作系统
Turbo C 程序集成环境或Visual C++ 程序集成环境
五、实验步骤
1、根据二叉树的各种存储结构建立二叉树;
2、设计求叶子结点个数算法和树的深度算法;
3、根据表达式建立相应的二叉树,生成表达式树的模块;
4、根据表达式树,求出表达式值,生成求值模块;
5、程序运行效果,测试数据分析算法。
六、测试数据
1、输入数据:2.2*(3.1+1.20)-7.5/3
正确结果:6.96
2、输入数据:(1+2)*3+(5+6*7);
正确输出:56
七、表达式求值
由于表达式求值算法较为复杂,所以单独列出来加以分析:
1、主要思路:由于操作数是任意的实数,所以必须将原始的中缀表达式中的操作数、操作符以及括号分解出来,并以字符串的形式保存;然后再将其转换为后缀表达式的顺序,后缀表达式可以很容易地利用堆栈计算出表达式的值。
二叉树的基本操作实验
功能实现
1.int CreatBiTree(BiTree &T)用递归的方法先序建立二叉树, 并用链表储存该二叉树
2.int PreTravel(BiTree &T)前序遍历
3.intMidTravel(BiTree &T)中序遍历
4.intPostTravel(BiTree &T)后序遍历
3.求二叉树的深度/结点数目/叶结点数目;(选做)
4. 将二叉树每个结点的左右子树交换位置。(选做)
[基本要求]
从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立),
[测试数据]
如输入:ABCффDEфGффFффф(其中ф表示空格字符)
则输出结果为
先序:ABCDEGF
中序:CBEGDFA
后序:CGEFDBA
层序:ABCDEFG
[选作内容]
采用非递归算法实现二叉树遍历。
三、实验前的准备工作
1、掌握树的逻辑结构。
2、掌握二叉树的逻辑结构和存储结构。
3、掌握二叉树的各种遍历算法的实现。
一 实验分析
本次试验是关于二叉树的常见操作,主要是二叉树的建立和遍历。二叉树的遍历有多种方法,本次试验我采用递归法,递归法比较简单。
BiTree T; //定义二叉树,初始化
CreatBiTree(T);
数据结构实验报告-树(二叉树)
实验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)
二叉树的基本操作实验报告
二叉树的基本操作实验报告
二叉树的基本操作实验报告
引言:
二叉树是一种常见的数据结构,它由节点组成,每个节点最多有两个子节点。
二叉树的基本操作包括创建、遍历、插入和删除等。本实验旨在通过实践来深
入了解二叉树的基本操作,并通过实验结果验证其正确性和有效性。
一、创建二叉树
创建二叉树是二叉树操作中的第一步。在本实验中,我们使用了递归算法来创
建二叉树。递归算法是一种重要的算法思想,通过将问题划分为更小的子问题
来解决复杂的问题。在创建二叉树时,我们首先创建根节点,然后递归地创建
左子树和右子树。
二、遍历二叉树
遍历二叉树是对二叉树中的每个节点进行访问的过程。常见的遍历方式有前序
遍历、中序遍历和后序遍历。前序遍历先访问根节点,然后递归遍历左子树和
右子树;中序遍历先递归遍历左子树,然后访问根节点,最后递归遍历右子树;后序遍历先递归遍历左子树和右子树,最后访问根节点。
三、插入节点
插入节点是向二叉树中添加新节点的操作。插入节点的过程需要遵循二叉树的
特性,即左子节点的值小于父节点的值,右子节点的值大于父节点的值。在插
入节点时,我们需要找到合适的位置,将新节点插入到正确的位置上。
四、删除节点
删除节点是从二叉树中移除节点的操作。删除节点的过程相对复杂,需要考虑
多种情况。如果要删除的节点是叶子节点,直接删除即可。如果要删除的节点只有一个子节点,将其子节点连接到父节点上。如果要删除的节点有两个子节点,我们需要找到其后继节点或前驱节点来替代被删除的节点。
实验结果:
通过实验,我们成功地实现了二叉树的基本操作。创建二叉树的递归算法能够正确地创建出符合要求的二叉树。遍历二叉树的算法能够按照指定的顺序遍历每个节点。插入节点和删除节点的操作也能够正确地修改二叉树的结构。
java实现二叉树的基本操作
java实现二叉树的基本操作
一、二叉树的定义
树是计算机科学中的一种基本数据结构,表示以分层方式存储的数据集合。树是由节点和边组成的,每个节点都有一个父节点和零个或多个子节点。每个节点可以对应于一定数据,因此树也可以被视作提供快速查找的一种方式。若树中每个节点最多只能有两个子节点,则被称为二叉树(Binary Tree)。二叉树是一种递归定义的数据结构,它或者为空集,或者由一个根节点以及左右子树组成。如果左子树非空,则左子树上所有节点的数值均小于或等于根节点的数值;如果右子树非空,则右子树上所有节点的数值均大于或等于根节点的数值;左右子树本身也分别是二叉树。
在计算机中实现二叉树,通常使用指针来表示节点之间的关系。在Java中,定义一个二叉树节点类的代码如下:
```
public class BinaryTree {
int key;
BinaryTree left;
BinaryTree right;
public BinaryTree(int key) {
this.key = key;
}
}
```
在这个类中,key字段表示该节点的数值;left和right字段分别表示这个节点的左右子节点。
1. 插入节点
若要在二叉树中插入一个节点,首先需要遍历二叉树,找到一个位置使得插入新节点后,依然满足二叉树的定义。插入节点的代码可以写成下面这个形式:
```
public void insert(int key) {
BinaryTree node = new BinaryTree(key); if (root == null) {
二叉树的建立和遍历的实验报告
竭诚为您提供优质文档/双击可除二叉树的建立和遍历的实验报告
篇一:二叉树遍历实验报告
数据结构实验报告
报告题目:二叉树的基本操作学生班级:
学生姓名:学号:
一.实验目的
1、基本要求:深刻理解二叉树性质和各种存储结构的特点及适用范围;掌握用指针类型描述、访问和处理二叉树的运算;熟练掌握二叉树的遍历算法;。
2、较高要求:在遍历算法的基础上设计二叉树更复杂操作算法;认识哈夫曼树、哈夫曼编码的作用和意义;掌握树与森林的存储与便利。二.实验学时:
课内实验学时:3学时课外实验学时:6学时三.实验题目
1.以二叉链表为存储结构,实现二叉树的创建、遍历
(实验类型:验证型)1)问题描述:在主程序中设计一个简单的菜单,分别调用相应的函数功能:1…建立树2…前序遍历树3…中序遍历树4…后序遍历树5…求二叉树的高度6…求二叉树的叶子节点7…非递归中序遍历树0…结束2)实验要求:在程序中定义下述函数,并实现要求的函数功能:createbinTree(binTree
structnode*lchild,*rchild;
}binTnode;元素类型:
intcreatebinTree(binTree
voidpreorder(binTreevoidInorder(binTree
voidpostorder(binTreevoidInordern(binTreeintleaf(bi nTree
intpostTreeDepth(binTree
2、编写算法实现二叉树的非递归中序遍历和求二叉树高度。1)问题描述:实现二叉树的非递归中序遍历和求二叉树高度2)实验要求:以二叉链表作为存储结构
二叉排序树与平衡二叉排序树基本操作的实现 文本文档
攀枝花学院本科学生课程设计任务书题 目 二叉排序树与平衡二叉树的实现1、课程设计的目的使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。3) 使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。2、课程设计的内容和要求(包括原始数据、技术要求、工作要求等)(1) (1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T;(2)对二叉排序树T作中序遍历,输出结果;(3)计算二叉排序树T查找成功的平均查找长度,输出结果;(4)输入元素x,查找二叉排序树T,若存在含x的结点,则删该结点,并作中序遍历(执行操作2);否则输出信息“无x”;(5)用数列L,生成平衡的二叉排序树BT:当插入新元素之后,发现当前的二叉排序树BT不是平衡的二叉排序树,则立即将它转换成新的平衡的二叉排序树BT; (6)计算平衡的二叉排序树BT的平均查找长度,输出结果。3、主要参考文献[1]刘大有等,《数据结构》(C语言版),高等教育出版社[2]严蔚敏等,《数据结构》(C语言版),清华大学出版社[3]William Ford,William Topp,《Data Structure with C++》清华大学出版社[4]苏仕华等,数据结构课程设计,机械工业出版社4、课程设计工作进度计划第1天 完成方案设计与程序框图 第2、3天 编写程序代码第4天 程序调试分析和结果第5天 课程设计报告和总结指导教师(签字) 日期 年 月 日教研室意见:年 月 日学生(签字): 接受任务时间: 年 月 日注:任务书由指导教师填写。课程设计(论文)指导教师成绩评定表题目名称 二叉排序树与平衡二叉树的实现评分项目 分值 得分 评价内涵工作表现20% 01 学习态度 6 遵守各项纪律,工作刻苦努力,具有良好的科学工作态度。02 科学实践、调研 7 通过实验、试验、查阅文献、深入生产实践等渠道获取与课程设计有关的材料。03 课题工作量 7 按期圆满完成规定的任务,工作量饱满。能力水平35% 04 综合运用知识的能力 10 能运用所学知识和技能去发现与解决实际问题,能正确处理实验数据,能对课题进行理论分析,得出有价值的结论。05 应用文献的能力 5 能独立查阅相关文献和从事其他调研;能提出并较好地论述课题的实施方案;有收集、加工各种信息及获取新知识的能力。06 设计(实验)
数据结构实验三——二叉树基本操作及运算实验报告
《数据结构与数据库》
实验报告
实验题目
二叉树的基本操作及运算
一、需要分析
问题描述:
实现二叉树(包括二叉排序树)的建立,并实现先序、中序、后序和按层次遍历,计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为2的结点数目、度为2的结点数目,以及二叉树常用运算。
问题分析:
二叉树树型结构是一类重要的非线性数据结构,对它的熟练掌握是学习数据结构的基本要求。由于二叉树的定义本身就是一种递归定义,所以二叉树的一些基本操作也可采用递归调用的方法。处理本问题,我觉得应该:
1、建立二叉树;
2、通过递归方法来遍历(先序、中序和后序)二叉树;
3、通过队列应用来实现对二叉树的层次遍历;
4、借用递归方法对二叉树进行一些基本操作,如:求叶子数、树的深度宽度等;
5、运用广义表对二叉树进行广义表形式的打印。
算法规定:
输入形式:为了方便操作,规定二叉树的元素类型都为字符型,允许各种字符类型的输入,没有元素的结点以空格输入表示,并且本实验是以先序顺序输入的。
输出形式:通过先序、中序和后序遍历的方法对树的各字符型元素进行遍历打印,再以广义表形式进行打印。对二叉树的一些运算结果以整型输出。
程序功能:实现对二叉树的先序、中序和后序遍历,层次遍历。计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为2的结点数目、度为2的结点数目。对二叉树的某个元素进行查找,对二叉树的某个结点进行删除。
测试数据:输入一:ABC□□DE□G□□F□□□(以□表示空格),查找5,删除E
预测结果:先序遍历ABCDEGF
中序遍历CBEGDFA
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三二叉树的基本运算
一、实验目的
1、使学生熟练掌握二叉树的逻辑结构和存储结构。
2、熟练掌握二叉树的各种遍历算法。
二、实验内容
[问题描述]
建立一棵二叉树,试编程实现二叉树的如下基本操作:
1. 按先序序列构造一棵二叉链表表示的二叉树T;
2. 对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出结点的遍历序列;
3. 求二叉树的深度/结点数目/叶结点数目;(选做)
4. 将二叉树每个结点的左右子树交换位置。(选做)
[基本要求]
从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立),
[测试数据]
如输入:ABCффDEфGффFффф(其中ф表示空格字符)
则输出结果为
先序:ABCDEGF
中序:CBEGDFA
后序:CGEFDBA
层序:ABCDEFG
[选作内容]
采用非递归算法实现二叉树遍历。
三、实验前的准备工作
1、掌握树的逻辑结构。
2、掌握二叉树的逻辑结构和存储结构。
3、掌握二叉树的各种遍历算法的实现。
一实验分析
本次试验是关于二叉树的常见操作,主要是二叉树的建立和遍历。二叉树的遍历有多种方法,本次试验我采用递归法,递归法比较简单。
二概要设计
功能实现
1.int CreatBiTree(BiTree &T) 用递归的方法先序建立二叉树, 并用链表储存该二叉树
2.int PreTravel(BiTree &T) 前序遍历
3. int MidTravel(BiTree &T) 中序遍历
4.int PostTravel(BiTree &T) 后序遍历
5.int Depth(BiTree &T) //计算树的深度
6.int howmuch(BiTree T,int h) 采用树节点指针数组,用于存放遍历到的元素地址,如果有左孩子,存入地址,j加一,否则没操作,通过访问数组输出层次遍历的结果。k计算叶子数,j为总节点。
7. int exchang(BiTree &T) 交换左右子树,利用递归,当有左右孩子时才交换
三详细设计
#include
#include
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
int CreatBiTree(BiTree &T)
{//先序法创建二叉树
char ch;
if((ch=getchar())==' ')
T=NULL;
else
{
T=(BiTNode*)malloc(sizeof(BiTNode));
if(!T)
exit(1);
T->data=ch;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
return 0;
}
int PreTravel(BiTree &T)
{//前序遍历
if(T)
{
printf("%c",T->data);
PreTravel(T->lchild);
PreTravel(T->rchild);
}
return 0;
}
int MidTravel(BiTree &T)
{//中序遍历
if(T)
{
MidTravel(T->lchild);
printf("%c",T->data);
MidTravel(T->rchild);
}
return 0;
}
int PostTravel(BiTree &T)
{//后序遍历
if(T)
{
PostTravel(T->lchild);
PostTravel(T->rchild);
printf("%c",T->data);
}
return 0;
}
int howmuch(BiTree T,int h)
{
BiTNode *Q[100];//树节点指针数组,用于存放遍历到的元素地址
if(T==NULL)
printf("空的二叉树\n");
Q[0]=T; //存入树根
int i,k=0;
int j=1; //j为总节点
for(i=0;i { if(Q[i]->lchild!=NULL) //如果有左孩子,存入地址,j加一,否则没操作 { Q[j]=Q[i]->lchild ; j++; } if(Q[i]->rchild!=NULL) //如果有右孩子,存入地址,j加一,否则没操作 { Q[j]=Q[i]->rchild ; j++; } if(Q[i]->lchild==NULL&&Q[i]->rchild==NULL) k++; //计算叶子数 } if(h==0) printf("%d", j); else if(h==1) printf("%d",k); else if(h==2) { for(i=0;i printf("%c",Q[i]->data); } else { printf("参数错误"); } return 0; } int Depth(BiTree &T) //计算树的深度 { int lh , rh ; if( NULL == T )