数据结构课程设计实验报告二叉树的实现.docx
《数据结构课程设计实验报告二叉树的实现.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计实验报告二叉树的实现.docx(21页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计实验报告二叉树的实现.docx](https://file1.bdocx.com/fileroot1/2022-12/30/5fbdb1d2-ddad-4f3d-b0ae-2a2c05ff3e52/5fbdb1d2-ddad-4f3d-b0ae-2a2c05ff3e521.gif)
数据结构课程设计实验报告二叉树的实现
《数据结构》
实验报告
题目:
_二叉树的实现
学号:
_______
姓名:
_______
东南大学成贤学院计算机系
实验题目
一、实验目的
1.掌握二叉树的基本操作,理解递归算法。
二、实验内容
1.将下图所示二叉树采用二叉链表进行存储,然后进行各种操作测试。
三、实验步骤
1.启动:
开始菜单→程序→MicrosoftVisualStudio6.0→
2.建立工程:
文件(File)→新建(new)→在弹出的对话框中选择工程标签(Project)→选中选项:
Win32ConsoleApplication(不能选别的)→输入工程名(ProjectName)→选择工程的存放位置(Location)→单击“确定”按钮(OK)→在弹出的对话框中选中选项:
AnEmptyProject→单击“完成”按钮(Finish)→在弹出的对话框中单击“确定”按钮(OK)。
3.创建头文件:
文件(File)→新建(new)→在弹出的对话框中选择文件标签(Files)→选中选项:
C/C++HeaderFile→输入头文件名(此处定义为“”)→单击“确定”按钮(OK)。
内容如下:
//二叉树结点类模板
template
structBinTreeNode
{
//数据成员:
ElemTypedata;//数据域
BinTreeNode*leftChild;//左孩子
BinTreeNode*rightChild;//右孩子
};
4.创建头文件:
文件(File)→新建(new)→在弹出的对话框中选择文件标签(Files)→选中选项:
C/C++HeaderFile→输入头文件名(此处定义为“”)→单击“确定”按钮(OK)。
定义了链队的类模板,代码如下:
#ifndef__BINNARY_TREE_H__
#define__BINNARY_TREE_H__
//二叉树类模板
template
classBinaryTree
{
private:
//二叉树的数据成员:
BinTreeNode*root;
//二叉树的私有函数:
voidPreOrderHelp(BinTreeNode*r);//先序遍历
voidInOrderHelp(BinTreeNode*r);//中序遍历
voidPostOrderHelp(BinTreeNode*r);//后序遍历
voidCreat(BinTreeNode*r,
intflag,ElemTypeempty,ElemTypeend);
//递归创建子树
BinTreeNode*GetRoot();//返回根指针
BinTreeNode*Locate(BinTreeNode*r,ElemTypee);//查找元素值为e的结点,返回指针.
BinTreeNode*LeftChild(ElemTypee);
//定位指定元素的左孩子,返回其指针。
BinTreeNode*Parent(BinTreeNode*r,ElemTypee);//定位指定元素的父结点
BinTreeNode*LeftSibling(ElemTypee);
//定位指定元素的左兄弟
intSize(BinTreeNode*r);
intDepth(BinTreeNode*r);
intLeaf(BinTreeNode*r);//统计并返回叶子结点个数
voidClear(BinTreeNode*r);
voidDisplayTreeeHelp(BinTreeNode*r,intlevel);
//按树状形式显示以r为根的二叉树,level为层次数,可设根结点的层次数为1
public:
//二叉树公共方法声明:
BinaryTree( );//无参数的构造函数模板
voidCreateBiTree();//构造二叉树
BinTreeNode*GetRoot();//返回二叉树的根
voidInOrder();//二叉树的中序遍历
voidPreOrder();//二叉树的先序遍历
voidPostOrder();//二叉树的后序遍历
voidLevelOrder();//按层遍历
intLocate(ElemTypee);//查找元素值为e的结点。
intGetLeft(ElemTypee,ElemType&c);
//读取指定元素的左孩子
intGetParent(ElemTypee,ElemType&f);
//读取指定元素的父元素
intGetLeftSibling(ElemTypee,ElemType&s);
//读取指定元素的左兄弟
intInsertChild(ElemTypee,ElemTypex,ElemTypey);
//为指定元素e插入左、右孩子
intSetElem(ElemTypee,ElemTypex);
//更新指定元素
intSize();
intDepth();
intLeaf();//统计并返回叶子结点个数
virtual~BinaryTree();//销毁二叉树
voidDisplayTree();
};
函数实现由学生自己完成
#endif
5.创建源程序文件main.cpp:
文件(File)→新建(new)→在弹出的对话框中选择文件标签(Files)→选中选项:
C++SourceFile→输入源程序文件名(main)→单击“确定”按钮(OK)。
文件内容如下:
#include"binary_tree.h"//二叉树类
intmain(void)
{
利用swtich构造菜单,对二叉树操作进行测试。
(初始化,构造二叉树,图形显示,前序,中序,后序遍历结果,求结点个数,二叉树深度,叶子结点树,查找结点,找指定结点的左孩子,双亲,左兄弟,插入新的左、右孩子。
}
注意:
1.在编程过程中注意及时保存编写内容。
四、实验结果
1.的代码
2.的代码
3.运行结果截图(可以有多张)
1、
#pragmaonce
#include””
usingnamespacestd;
//二叉树类模板
template
classBinaryTree
{
private:
//二叉树的数据成员:
BinTreeNode*root;
//二叉树的私有函数:
voidPreOrderHelp(BinTreeNode*r);//先序遍历
voidInOrderHelp(BinTreeNode*r);//中序遍历
voidPostOrderHelp(BinTreeNode*r);//后序遍历
voidCreat(BinTreeNode*r,
intflag,ElemTypeempty,ElemTypeend);
//递归创建子树
BinTreeNode*GetRoot();//返回根指针
BinTreeNode*Locate(BinTreeNode*r,ElemTypee);//查找元素值为e的结点,返回指针.
BinTreeNode*LeftChild(ElemTypee);
//定位指定元素的左孩子,返回其指针。
BinTreeNode*Parent(BinTreeNode*r,ElemTypee);//定位指定元素的父结点
BinTreeNode*LeftSibling(ElemTypee);
//定位指定元素的左兄弟
intSize(BinTreeNode*r);
intDepth(BinTreeNode*r);
intLeaf(BinTreeNode*r);//统计并返回叶子结点个数
voidClear(BinTreeNode*r);
voidDisplayTreeeHelp(BinTreeNode*r,intlevel);
//按树状形式显示以r为根的二叉树,level为层次数,可设根结点的层次数为1
intsize;
public:
//二叉树公共方法声明:
BinaryTree();//无参数的构造函数模板
voidCreateBiTree();//构造二叉树
//BinTreeNode*GetRoot();//返回二叉树的根
voidInOrder();//二叉树的中序遍历
voidPreOrder();//二叉树的先序遍历
voidPostOrder();//二叉树的后序遍历
voidLevelOrder();//按层遍历
intLocate(ElemTypee);//查找元素值为e的结点。
intGetLeft(ElemTypee,ElemType&c);
//读取指定元素的左孩子
intGetParent(ElemTypee,ElemType&f);
//读取指定元素的父元素
intGetLeftSibling(ElemTypee,ElemType&s);
//读取指定元素的左兄弟
intInsertChild(ElemTypee,ElemTypex,ElemTypey);
//为指定元素e插入左、右孩子
intSetElem(ElemTypee,ElemTypex);
//更新指定元素
intSize();
intDepth();
intLeaf();//统计并返回叶子结点个数
virtual~BinaryTree();//销毁二叉树
voidDisplayTree();
};
template
voidBinaryTree:
:
PreOrderHelp(
BinTreeNode*r)//private
{
if(r!
=NULL)
{
cout<data<<"";//访问根结点
PreOrderHelp(r->leftChild);//遍历左子树
PreOrderHelp(r->rightChild);//遍历右子树
}
}
template
voidBinaryTree:
:
PreOrder()//public
{
PreOrderHelp(root);
}
template
voidBinaryTree:
:
InOrderHelp(
BinTreeNode*r)//private
{
if(r!
=NULL)
{
InOrderHelp(r->leftChild);//遍历左子树
cout<data<<"";//访问根结点
InOrderHelp(r->rightChild);//遍历右子树
}
}
template
voidBinaryTree:
:
InOrder()//public
{
InOrderHelp(root);
}
template
voidBinaryTree:
:
PostOrderHelp(
BinTreeNode*r)//private
{
if(r!
=NULL)
{
PostOrderHelp(r->leftChild);//遍历左子树
PostOrderHelp(r->rightChild);//遍历右子树
cout<data<<"";//访问根结点
}
}
template
voidBinaryTree:
:
PostOrder()//public
{
PostOrderHelp(root);
}
template
voidBinaryTree:
:
LevelOrder()
{
LinkQueue*>q;
BinTreeNode*t=root;
if(t!
=NULL)(t);//如果根非空,则入队
while(!
())
{
(t);
cout<data<<"";//
if(t->leftChild!
=NULL)//左孩子非空
(t->leftChild);//左孩子入队
if(t->rightChild!
=NULL)//右孩子非空
(t->rightChild);//右孩子入队
}
}
template
BinaryTree:
:
BinaryTree()
{
root=NULL;
}
template
voidBinaryTree:
:
CreateBiTree()
{
BinTreeNode*r;
ElemTypeend,empty,x;
cout<<"按先序序列的顺序输入一棵二叉树"<cout<<"输入的结束标志是:
";
cin>>end;
cout<<"输入的空结点标志是:
";
cin>>empty;
cout<<"请开始输入:
"<cin>>x;
r=newBinTreeNode;
r->data=x;
r->leftChild=r->rightChild=NULL;
root=r;
Creat(r,0,empty,end);//创建根结点的左子树
Creat(r,1,empty,end);//创建根结点的右子树
}
template
voidBinaryTree:
:
Creat(BinTreeNode*r,intflag,ElemTypeempty,ElemTypeend)
{
BinTreeNode*p;ElemTypex;
cin>>x;
if(x!
=end&&x!
=empty)
{
p=newBinTreeNode;p->data=x;
p->leftChild=p->rightChild=NULL;
if(flag==0)r->leftChild=p;//p为左子树
elser->rightChild=p;//p为右子树
size++;
Creat(p,0,empty,end);//递归创建左子树
Creat(p,1,empty,end);//递归创建右子树
}
}
template
BinTreeNode*BinaryTree:
:
GetRoot()
{
returnroot;
}
template
BinTreeNode*BinaryTree:
:
Locate(BinTreeNode*r,ElemTypee)//private
{
if(r==NULL)returnNULL;
if(r->data==e)returnr;
BinTreeNode*p=Locate(r->leftChild,e);
if(p==NULL)p=Locate(r->rightChild,e);
returnp;
}
template
intBinaryTree:
:
Locate(ElemTypee)//public
{
if(Locate(root,e)==NULL)
returnfalse;
else
returntrue;
}
template
BinTreeNode*BinaryTree
:
:
LeftChild(ElemTypee)//private
{
BinTreeNode*ep=Locate(root,e);
if(ep==NULL)returnNULL;//找不到结点e
if(ep->leftChild==NULL)//e无左孩子
returnNULL;
returnep->leftChild;//返回e左孩子的指针
}
template
intBinaryTree:
:
GetLeft(ElemTypee,ElemType&c)//Public
{
BinTreeNode*p=LeftChild(e);
if(p==NULL)returnfalse;//e无左孩子
c=p->data;
returntrue;
}
template
BinTreeNode*BinaryTree:
:
Parent(BinTreeNode*r,ElemTypee)//private
{
BinTreeNode*p;
if(r==NULL)returnNULL;
if((r->leftChild!
=NULL&&r->leftChild->data==e)||
(r->rightChild!
=NULL&&r->rightChild->data==e))
returnr;//r是e的父结点,返回结点r的指针
p=Parent(r->leftChild,e);//递归调用r的左子树
if(p==NULL)p=Parent(r->rightChild,e);
returnp;
}
template
intBinaryTree:
:
GetParent(ElemTypee,ElemType&f)//public
{
if(root==NULL||root->data==e)
returnfalse;
BinTreeNode*p=Parent(root,e);
if(p==NULL)returnfalse;//树中无元素e
f=p->data;
returntrue;
}
template
BinTreeNode*BinaryTree:
:
LeftSibling(ElemTypee)//private
{
if(root->data==e)returnNULL;
BinTreeNode*p=Parent(root,e);
if(p==NULL)returnNULL;//无e结点
if(p->leftChild->data==e)//e是其父亲的左孩子
returnNULL;
returnp->leftChild;//返回e的左兄弟指针
}
template
intBinaryTree:
:
GetLeftSibling(ElemTypee,ElemType&s)
{
if(root->data==e)returnfalse;//根结点无兄弟
BinTreeNode*p=LeftSibling(e);
if(p==NULL)returnfalse;//e无左兄弟
s=p->data;
returntrue;
}
template
intBinaryTree:
:
InsertChild(ElemTypee,ElemTypex,ElemTypey)
{
BinTreeNode*ep,*xp,*yp;
ep=Locate(root,e);//定位元素e
if(ep==NULL)returnfalse;//找不到元素e
xp=newBinTreeNode;
xp->data=x;
xp->rightChild=NULL;
yp=newBinTreeNode;
yp->data