数据结构实验报告树形数据结构实验.docx

上传人:b****5 文档编号:6370210 上传时间:2023-01-05 格式:DOCX 页数:37 大小:32.34KB
下载 相关 举报
数据结构实验报告树形数据结构实验.docx_第1页
第1页 / 共37页
数据结构实验报告树形数据结构实验.docx_第2页
第2页 / 共37页
数据结构实验报告树形数据结构实验.docx_第3页
第3页 / 共37页
数据结构实验报告树形数据结构实验.docx_第4页
第4页 / 共37页
数据结构实验报告树形数据结构实验.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

数据结构实验报告树形数据结构实验.docx

《数据结构实验报告树形数据结构实验.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告树形数据结构实验.docx(37页珍藏版)》请在冰豆网上搜索。

数据结构实验报告树形数据结构实验.docx

数据结构实验报告树形数据结构实验

实验报告书

课程名:

数据结构

题目:

树形数据结构实验

(1)

班级:

学号:

姓名:

一、目的与要求

1)熟练掌握二叉树的二叉链表表示创建算法与实现;

2)熟练掌握栈的前序、中序与后序递归遍历算法与实现;

3)熟练掌握前序、中序与后序遍历线索二叉树的基本算法与实现;

4)按照实验题目要求独立正确地完成实验内容(提交程序清单及相关实验数据与运行结果);

5)认真书写实验报告,并按时提交。

二、实验内容或题目

1)创建二叉树:

广义表式创建与先序创建;

2)遍历二叉树:

先,中,后,层序遍历,广义表式遍历,凹凸式遍历;

3)二叉树属性:

深度,宽度,结点数,叶子结点数

4)二叉树路径:

叶子结点到根结点的路径;

5)二叉树线索:

中序线索二叉树;

6)二叉树置空:

清空二叉树。

三、实验步骤与源程序

1)头文件Btree.h

#include

#include

#include

#include

#include

/**********************************对象--二叉数********************************/

typedefcharElemType;//定义元素类型

#defineMAXSIZE100//确定二叉树的最大结点数

/******************************二叉数的结点类定义******************************/

classBTreeNode

private:

intltag,rtag;//线索标记

BTreeNode*left;//左子树指针

BTreeNode*right;//右子树指针

public:

ElemTypedata;//数据域

//构造函数

BTreeNode()

ltag=0;

rtag=0;

left=NULL;

right=NULL;

//带参数初始化的构造函数

BTreeNode(ElemTypeitem,intltag1,intrtag1,BTreeNode*left1,BTreeNode*right1)

data=item;

ltag=ltag1;

rtag=rtag1;

left=left1;

right=right1;

BTreeNode*&Left()//返回结点的左孩子

returnleft;

//返回结点的右孩子

BTreeNode*&Right()

returnright;

friendclassBinaryTree;//二叉树类为二叉树结点类的友元类

/**********************************二叉数的类定义*******************************/

classBinaryTree

private:

BTreeNode*root;

public:

//构造函数.初始化二叉树为空

BinaryTree(){root=NULL;}

//判断二叉树是否为空

boolBTreeEmpty(){returnroot==NULL;}

/****************************创建二叉数的相关成员函数***********************/

//按照二叉树的广义表表示创建二叉树

voidCreateBTree1();

//递归创建二叉树,被函数CreateBTree1调用

voidCreate1(BTreeNode*&BT);

//按一定次序输入二叉树中结点的值(一个字符),空格表示空树

voidCreateBTree2(intmake);

//递归先序创建二叉树,被函数CreateBTree2调用

voidGreate2(BTreeNode*&BT,intmark);

//复制二叉树

voidBTreeCopy(BTreeNode*&root,BTreeNode*&BT);

/****************************遍历二叉数的相关成员函数***********************/

//按任一种遍历次序输出二叉树中的所有结点

voidTraverseBTree(intmark);

//用于遍历的递归函数,被函数TraverseBTree调用

voidTraverse(BTreeNode*&BT,intmark);

//先序遍历的递归函数

voidPreOrder(BTreeNode*&BT);

//先序遍历的非递归函数一

voidPreOrder_N1(BTreeNode*&BT);

//先序遍历的非递归函数二

voidPreOrder_N2(BTreeNode*&BT);

//中序遍历的递归函数

voidInOrder(BTreeNode*&BT);

//中序遍历的非递归函数一

voidInOrder_N1(BTreeNode*&BT);

//中序遍历的非递归函数二

voidInOrder_N2(BTreeNode*&BT);

//后序遍历的递归函数

voidPostOrder(BTreeNode*&BT);

//后序遍历的非递归函数一

voidPostOrder_N1(BTreeNode*&BT);

//后序遍历的递归函数

voidPostOrder_N2(BTreeNode*&BT);

//层序遍历的非递归函数

voidLayerOrder(BTreeNode*&BT);

//按照二叉树的广义表表示输出整个二叉树

voidGPrintBTree();

//广义表形式输出整个二叉树的递归函数,被函数Print调用

voidGPrint(BTreeNode*&BT);

//以凹凸表示法输出二叉树

voidOPrintTree();

/**********************************二叉树的属性*****************************/

/****************计算二叉数深度,宽度,叶子,结点的相关成员函数****************/

//求二叉树的深度

intBTreeDepth();

//用于求二叉树深度的递归函数,被BTreeDepth调用

intDepth(BTreeNode*&BT);

//求二叉树的宽度

intBTreeWidth();

//求二叉树中所有结点数

intBTreeCount();

//用于求二叉树所有结点数的递归函数,被函数BTreeCount调用

intCount(BTreeNode*&BT);

//求二叉树中所有叶子结点数

intBTreeLeafCount();

//用于求二叉树中所有叶子结点数的递归函数,被函数BTreeLeafCount调用

intLeafCount(BTreeNode*&BT);

//输出二叉树的所有叶子结点

voidBTreeLeafPrint();

//用于输出二叉树的所有叶子结点的递归函数,被函数BTreeLeafPrint调用

voidLeafPrint(BTreeNode*&BT);

/***********************二叉树中从根结点到叶子结点的路径相关函数****************/

//输出从根结点到叶子结点的路径,以及最长路径

voidBTreePath();

//输出从根结点到叶子结点的路径的递归函数,被函数BTreePath调用

voidPathLeaf(BTreeNode*&BT,ElemTypepath[],intpathlen);

//求最长路径的递归函数,被函数BTreePaht调用

voidBTreeLongpath(BTreeNode*&BT,ElemTypepath[],intpathlen,ElemTypelongpath[],int&longpathlen);

//非递归方法输出从根结点到叶子结点的路径

voidBTreePath_N1();

//返回data域为x的结点指针

voidBTreeFind(ElemTypex);

//返回data域为x的结点指针的递归函数,被函数BTreeFind调用

BTreeNode*FindNode(BTreeNode*&BT,ElemTypex);

/*************************************线索二叉树****************************/

//线索化二叉树

voidCreateThread();

//中序线索化二叉树的递归函数,被函数CreateThread调用

voidInOrderThread(BTreeNode*&BT,BTreeNode*&pre);

//中序线索化二叉树中实现中序遍历,被函数CreateThread调用

voidThInOrder(BTreeNode*&BT);

/****************************销毁二叉数的相关成员函数***********************/

//置空二叉树

voidBTreeClear();

//用于清除二叉树的递归函数,被函数BTreeClear与~BinaryTree调用

voidClear(BTreeNode*&BT);

//析构函数,清除二叉树

~BinaryTree();

/******************************创建二叉数的相关成员函数*************************/

//按照二叉树的广义表表示创建二叉树

voidBinaryTree:

:

CreateBTree1()

cout<<"输入广义表形式的二叉树:

"<

root=NULL;//给树根指针置空

Create1(root);

//递归创建二叉树,被函数CreateBTree1调用

voidBinaryTree:

:

Create1(BTreeNode*&BT)

BTreeNode*stack[MAXSIZE],*p=NULL;

intk,top=-1;

charch;

while((ch=getchar())!

='#')

switch(ch)

case'(':

top++;

stack[top]=p;

k=1;//即将建立左结点

break;

case')':

top--;

break;

case',':

k=2;//即将建立右结点

break;

default:

if(!

(p=newBTreeNode))

cout<<"\n堆内存分配失败\n";

exit

(1);

p->data=ch;

p->left=p->right=NULL;

if(BT==NULL)//p指向二叉树的根结点,建立根结点

BT=p;

else//已经建立根结点

if(k==1)//建立左结点

stack[top]->left=p;

else//建立右结点

stack[top]->right=p;

}//switch(ch)

}//while

//按一定次序输入二叉树中结点的值(一个字符),空格表示空树

voidBinaryTree:

:

CreateBTree2(intmark)

switch(mark)

case1:

puts("按先序输入二叉树:

");

break;

case2:

puts("按中序输入二叉树:

");

break;

case3:

puts("按后序输入二叉树:

");

break;

root=NULL;//给树根指针置空

BTreeNode*&p=root;//定义p为指向二叉树结点的指针

Greate2(p,mark);

//递归创建二叉树,被函数CreateBTree2调用

voidBinaryTree:

:

Greate2(BTreeNode*&BT,intmark)

charch;

ch=getchar();

switch(mark)

case1:

//先序创建

if(ch=='')

BT=NULL;

else

if(!

(BT=newBTreeNode))

cout<<"\n堆内存分配失败\n";

exit

(1);

BT->data=ch;

Greate2(BT->left,mark);

Greate2(BT->right,mark);

break;

case2:

break;

case3:

break;

//复制二叉树

voidBinaryTree:

:

BTreeCopy(BTreeNode*&root,BTreeNode*&BT)

if(root)

if(!

(BT=newBTreeNode))

exit

(1);

BT->data=root->data;

BTreeCopy(root->left,BT->left);

BTreeCopy(root->right,BT->right);

else

BT=NULL;

/*******************************遍历二叉数的相关成员函数************************/

//按任一种遍历次序输出二叉树中的所有结点

voidBinaryTree:

:

TraverseBTree(intmark)

srand(time(NULL));//产生随机种子数,用来选择相同顺序遍历的不同算法

Traverse(root,mark);

cout<

//用于遍历的递归函数,被函数TraverseBTree调用

voidBinaryTree:

:

Traverse(BTreeNode*&BT,intmark)

intoption;

switch(mark)

case1:

//先序遍历

option=rand()%3+1;

switch(option)//随机选择一种先序算法

case1:

PreOrder(BT);

break;

case2:

PreOrder_N1(BT);

break;

case3:

PreOrder_N2(BT);

break;

break;

case2:

//中序遍历

option=rand()%3+1;

switch(option)//随机选择一种中序算法

case1:

InOrder(BT);

break;

case2:

InOrder_N1(BT);

break;

case3:

InOrder_N2(BT);

break;

break;

case3:

//后序遍历

option=rand()%3+1;

switch(option)//随机选择一种先序算法

case1:

PostOrder(BT);

break;

case2:

PostOrder_N1(BT);

break;

case3:

PostOrder_N2(BT);

break;

break;

case4:

//层序遍历

LayerOrder(BT);

break;

default:

cout<<"mark的值无效!

遍历失败!

"<

//先序遍历的递归函数

voidBinaryTree:

:

PreOrder(BTreeNode*&BT)

if(BT!

=NULL)

cout<data<<'';

PreOrder(BT->left);

PreOrder(BT->right);

//先序遍历的非递归函数一

voidBinaryTree:

:

PreOrder_N1(BTreeNode*&BT)

BTreeNode*p;

struct

BTreeNode*pt;

inttag;

}stack[MAXSIZE];

inttop=-1;

top++;

stack[top].pt=BT;

stack[top].tag=1;

while(top>-1)//栈不空时循环

if(stack[top].tag==1)//不能直接访问

p=stack[top].pt;

top--;

if(p!

=NULL)//按右,左,结点顺序进栈,后进先出,即先序遍历

top++;

stack[top].pt=p->right;//右孩子入栈

stack[top].tag=1;

top++;

stack[top].pt=p->left;//左孩子入栈

stack[top].tag=1;

top++;

stack[top].pt=p;//根结点入栈

stack[top].tag=0;//可以直接访问

if(stack[top].tag==0)//可以直接访问

cout<data<<'';

top--;

//先序遍历的非递归函数二

voidBinaryTree:

:

PreOrder_N2(BTreeNode*&BT)

BTreeNode*stack[MAXSIZE],*p;

inttop=-1;

if(BT!

=NULL)

top++;//根结点入栈

stack[top]=BT;

while(top>-1)//栈不空时循环

p=stack[top];

top--;

cout<data<<"";

if(p->right!

=NULL)//右孩子入栈

top++;

stack[top]=p->right;

if(p->left!

=NULL)//左孩子入栈

top++;

stack[top]=p->left;

}//while

}//if(root!

=NULL)

//中序遍历的递归函数

voidBinaryTree:

:

InOrder(BTreeNode*&BT)

if(BT!

=NULL)

InOrder(BT->left);

cout<data<<'';

InOrder(BT->right);

//中序遍历的非递归函数一

voidBinaryTree:

:

InOrder_N1(BTreeNode*&BT)

BTreeNode*p;

struct

BTreeNode*pt;

inttag;

}stack[MAXSIZE];

inttop=-1;

top++;

stack[top].pt=BT;

stack[top].tag=1;

while(top>-1)//栈不空时循环

if(stack[top].tag==1)//不能直接访问

p=stack[top].pt;

top--;

if(p!

=NULL)//按右,左,结点顺序进栈,后进先出,即先序遍历

top++;

stack[top].pt=p->right;//右孩子入栈

stack[top].tag=1;

top++;

stack[top].pt=p;//根结点入栈

stack[top].tag=0;//可以直接访问

top++;

stack[top].pt=p->left;//左孩子入栈

stack[top].tag=1;

if(stack[top].tag==0)//可以直接访问

cout<data<<'';

top--;

//中序遍历的非递归函数二

voidBinaryTree:

:

InOrder_N2(BTreeNode*&BT)

BTreeNode*stack[MAXSIZE],*p;

inttop=-1;

if(BT!

=NULL)

p=BT;

while(top>-1||p!

=NULL)

while(p!

=NULL)//所有左结点入栈

top++;

stack[top]=p;

p=p->left;

if(top>-1)

p=stack[top];

top--;

cout<data<<"";

p=p->right;

}//if

//后序遍历的递归函数

voidBinaryTree:

:

PostOrder(BTreeNode*&BT)

if(BT!

=NULL)

PostOrder(BT->left);

PostOrder(BT->right);

cout<data<<'';

//后序遍历的非递归函数一

voidBinaryTree:

:

PostOrder_N1(BTreeNode*&BT)

BTreeNode*p;

struct

BTreeNode*pt;

inttag;

}stack[MAXSIZE];

inttop=-1;

top++;

stack[top].pt=BT;

stack[top].tag=1;

while(top>-1)//栈不空时循环

if(stack[top].tag==1)//不能

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1