数据结构 二叉树的实现.docx
- 文档编号:23701360
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:25
- 大小:32.62KB
数据结构 二叉树的实现.docx
《数据结构 二叉树的实现.docx》由会员分享,可在线阅读,更多相关《数据结构 二叉树的实现.docx(25页珍藏版)》请在冰豆网上搜索。
数据结构二叉树的实现
《数据结构》
实验报告
题目:
_
学号:
_________
姓名:
___________
东南大学成贤学院计算机系
实验题目
一、实验目的
1.掌握二叉树的基本操作,理解递归算法。
二、实验内容
1.将下图所示二叉树采用二叉链表进行存储,然后进行各种操作测试。
三、实验步骤
1.启动VC6.0:
开始菜单→程序→MicrosoftVisualStudio6.0→MicrosoftVisualC++6.0
2.建立工程:
文件(File)→新建(new)→在弹出的对话框中选择工程标签(Project)→选中选项:
Win32ConsoleApplication(不能选别的)→输入工程名(ProjectName)→选择工程的存放位置(Location)→单击“确定”按钮(OK)→在弹出的对话框中选中选项:
AnEmptyProject→单击“完成”按钮(Finish)→在弹出的对话框中单击“确定”按钮(OK)。
3.创建头文件:
文件(File)→新建(new)→在弹出的对话框中选择文件标签(Files)→选中选项:
C/C++HeaderFile→输入头文件名(此处定义为“bin_tree_node.h”)→单击“确定”按钮(OK)。
bin_tree_node.h内容如下:
//二叉树结点类模板
template
structBinTreeNode
{
//数据成员:
ElemTypedata;//数据域
BinTreeNode
BinTreeNode
};
4.创建头文件:
文件(File)→新建(new)→在弹出的对话框中选择文件标签(Files)→选中选项:
C/C++HeaderFile→输入头文件名(此处定义为“binary_tree.h”)→单击“确定”按钮(OK)。
binary_tree.h定义了链队的类模板,代码如下:
#ifndef__BINNARY_TREE_H__
#define__BINNARY_TREE_H__
//二叉树类模板
template
classBinaryTree
{
private:
//二叉树的数据成员:
BinTreeNode
//二叉树的私有函数:
voidPreOrderHelp(BinTreeNode
voidInOrderHelp(BinTreeNode
voidPostOrderHelp(BinTreeNode
voidCreat(BinTreeNode
intflag,ElemTypeempty,ElemTypeend);
//递归创建子树
BinTreeNode
BinTreeNode
BinTreeNode
//定位指定元素的左孩子,返回其指针。
BinTreeNode
BinTreeNode
//定位指定元素的左兄弟
intSize(BinTreeNode
intDepth(BinTreeNode
intLeaf(BinTreeNode
voidClear(BinTreeNode
voidDisplayTreeeHelp(BinTreeNode
//按树状形式显示以r为根的二叉树,level为层次数,可设根结点的层次数为1
public:
//二叉树公共方法声明:
BinaryTree( );//无参数的构造函数模板
voidCreateBiTree();//构造二叉树
BinTreeNode
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)。
main.cpp文件内容如下:
#include"binary_tree.h"//二叉树类
intmain(void)
{
利用swtich构造菜单,对二叉树操作进行测试。
(初始化,构造二叉树,图形显示,前序,中序,后序遍历结果,求结点个数,二叉树深度,叶子结点树,查找结点,找指定结点的左孩子,双亲,左兄弟,插入新的左、右孩子。
}
注意:
1.在编程过程中注意及时保存编写内容。
四、实验结果
1.binary_tree.h的代码
2.main.cpp的代码
3.运行结果截图(可以有多张)
1、binary_tree.h
#pragmaonce
#include”stdafx.h”
usingnamespacestd;
//二叉树类模板
template
classBinaryTree
{
private:
//二叉树的数据成员:
BinTreeNode
//二叉树的私有函数:
voidPreOrderHelp(BinTreeNode
voidInOrderHelp(BinTreeNode
voidPostOrderHelp(BinTreeNode
voidCreat(BinTreeNode
intflag,ElemTypeempty,ElemTypeend);
//递归创建子树
BinTreeNode
BinTreeNode
BinTreeNode
//定位指定元素的左孩子,返回其指针。
BinTreeNode
BinTreeNode
//定位指定元素的左兄弟
intSize(BinTreeNode
intDepth(BinTreeNode
intLeaf(BinTreeNode
voidClear(BinTreeNode
voidDisplayTreeeHelp(BinTreeNode
//按树状形式显示以r为根的二叉树,level为层次数,可设根结点的层次数为1
intsize;
public:
//二叉树公共方法声明:
BinaryTree();//无参数的构造函数模板
voidCreateBiTree();//构造二叉树
//BinTreeNode
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
{
if(r!
=NULL)
{
cout<
PreOrderHelp(r->leftChild);//遍历左子树
PreOrderHelp(r->rightChild);//遍历右子树
}
}
template
voidBinaryTree
:
PreOrder()//public
{
PreOrderHelp(root);
}
template
voidBinaryTree
:
InOrderHelp(
BinTreeNode
{
if(r!
=NULL)
{
InOrderHelp(r->leftChild);//遍历左子树
cout<
InOrderHelp(r->rightChild);//遍历右子树
}
}
template
voidBinaryTree
:
InOrder()//public
{
InOrderHelp(root);
}
template
voidBinaryTree
:
PostOrderHelp(
BinTreeNode
{
if(r!
=NULL)
{
PostOrderHelp(r->leftChild);//遍历左子树
PostOrderHelp(r->rightChild);//遍历右子树
cout<
}
}
template
voidBinaryTree
:
PostOrder()//public
{
PostOrderHelp(root);
}
template
voidBinaryTree
:
LevelOrder()
{
LinkQueue
BinTreeNode
if(t!
=NULL)q.InQueue(t);//如果根非空,则入队
while(!
q.Empty())
{
q.OutQueue(t);
cout<
if(t->leftChild!
=NULL)//左孩子非空
q.InQueue(t->leftChild);//左孩子入队
if(t->rightChild!
=NULL)//右孩子非空
q.InQueue(t->rightChild);//右孩子入队
}
}
template
BinaryTree
:
BinaryTree()
{
root=NULL;
}
template
voidBinaryTree
:
CreateBiTree()
{
BinTreeNode
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 { BinTreeNode cin>>x; if(x! =end&&x! =empty) { p=newBinTreeNode 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 : GetRoot() { returnroot; } template BinTreeNode : Locate(BinTreeNode { if(r==NULL)returnNULL; if(r->data==e)returnr; BinTreeNode if(p==NULL)p=Locate(r->rightChild,e); returnp; } template intBinaryTree : Locate(ElemTypee)//public { if(Locate(root,e)==NULL) returnfalse; else returntrue; } template BinTreeNode : : LeftChild(ElemTypee)//private { BinTreeNode if(ep==NULL)returnNULL;//找不到结点e if(ep->leftChild==NULL)//e无左孩子 returnNULL; returnep->leftChild;//返回e左孩子的指针 } template intBinaryTree : GetLeft(ElemTypee,ElemType&c)//Public { BinTreeNode if(p==NULL)returnfalse;//e无左孩子 c=p->data; returntrue; } template BinTreeNode : Parent(BinTreeNode { BinTreeNode 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 if(p==NULL)returnfalse;//树中无元素e f=p->data; returntrue; } template BinTreeNode : LeftSibling(ElemTypee)//private { if(root->data==e)returnNULL; BinTreeNode 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 if(p==NULL)returnfalse;//e无左兄弟 s=p->data; returntrue; } template intBinaryTree : InsertChild(ElemTypee,ElemTypex,ElemTypey) { BinTreeNode ep=Locate(root,e);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 二叉树的实现 二叉 实现