数据结构实验报告-树(二叉树)

阅读: 评论:0

2024年2月7日发(作者:)

数据结构实验报告-树(二叉树)

实验5:树(二叉树)(采用二叉链表存储)

一、 实验项目名称

二叉树及其应用

二、 实验目的

熟悉二叉树的存储结构的特性以及二叉树的基本操作。

三、 实验基本原理

之前我们都是学习的线性结构,这次我们就开始学习非线性结构——树。线性结构中结点间具有唯一前驱、唯一后继关系,而非线性结构中结点的前驱、后继的关系并不具有唯一性。在树结构中,节点间关系是前驱唯一而后继不唯一,即结点之间是一对多的关系。直观地看,树结构是具有分支关系的结构(其分叉、分层的特征类似于自然界中的树)。

四、 主要仪器设备及耗材

Window 11、Dev-C++5.11

五、 实验步骤

1. 导入库和预定义

2. 创建二叉树

3. 前序遍历

4. 中序遍历

5. 后序遍历

6. 总结点数

7. 叶子节点数

8. 树的深度

9. 树根到叶子的最长路径

10. 交换所有节点的左右子女

11. 顺序存储

12. 显示顺序存储

13. 测试函数和主函数

对二叉树的每一个操作写测试函数,然后在主函数用while+switch-case的方式实现一个带菜单的简易测试程序,代码见“实验完整代码”。

实验完整代码:

#include

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)

{

ElemType e;

e = getchar();

{

if(!(T = (BiTNode *)malloc(sizeof (BiTNode))))

{

}

cout << "内存分配错误!" << endl;

exit(0);

return;

T = NULL;

if(e == 'n')

else if(e == ' ')

else

}

}

T->data = e;

createBiTree(T->l);

createBiTree(T->r);

void createBiTree2(BiTNode *T,int u)

{

if(T)

{

}

}

void outputBiTree2(int n)

{

int cnt = 0;

for(int i = 0;cnt <= n;i++)

{

}

cout << endl;

}

void preOrderTraverse(BiTNode *T)

{

if(T)

{

}

}

void inOrderTraverse(BiTNode *T)

{

if(T)

{

inOrderTraverse(T->l);

cout << T->data;

cout << T->data;

preOrderTraverse(T->l);

preOrderTraverse(T->r);

cout << SqBiTree[i];

if(SqBiTree[i] != ' ')

cnt ++;

SqBiTree[u] = T->data;

createBiTree2(T->l,2 * u + 1);

createBiTree2(T->r,2 * u + 2);

}

}

inOrderTraverse(T->r);

void beOrderTraverse(BiTNode *T)

{

if(T)

{

}

}

int sumOfVer(BiTNode *T)

{

if(!T)

}

int sumOfLeaf(BiTNode *T)

{

if(!T)

}

int depth(BiTNode *T)

{

if(!T)

}

bool LongestPath(int dist,int dist2,vector &ne,BiTNode *T)

{

if(!T)

if(dist2 == dist)

return false;

return 0;

return max(depth(T->l),depth(T->r)) + 1;

return 0;

return 1;

if(T->l == NULL && T->r == NULL)

return sumOfLeaf(T->l) + sumOfLeaf(T->r);

return 0;

beOrderTraverse(T->l);

beOrderTraverse(T->r);

cout << T->data;

return sumOfVer(T->l) + sumOfVer(T->r) + 1;

{

}

return true;

if(LongestPath(dist,dist2 + 1,ne,T->l))

_back(T->l->data);

return true;

else if(LongestPath(dist,dist2 + 1,ne,T->r))

{

}

return false;

}

void swapVer(BiTNode *&T)

{

if(T)

{

}

}

//以下是测试程序

void test1()

{

getchar();

cout << "请以先序次序输入二叉树结点的值,空结点用空格表示:" << endl;

createBiTree(T);

cout << "二叉树创建成功!" << endl;

}

void test2()

{

cout << "二叉树的前序遍历为:" << endl;

preOrderTraverse(T);

cout << endl;

}

swapVer(T->l);

swapVer(T->r);

BiTNode *tmp = T->l;

T->l = T->r;

T->r = tmp;

_back(T->r->data);

return true;

void test3()

{

cout << "二叉树的中序遍历为:" << endl;

inOrderTraverse(T);

cout << endl;

}

void test4()

{

cout << "二叉树的后序遍历为:" << endl;

beOrderTraverse(T);

cout << endl;

}

void test5()

{

cout << "二叉树的总结点数为:" << sumOfVer(T) << endl;

}

void test6()

{

cout << "二叉树的叶子结点数为:" << sumOfLeaf(T) << endl;

}

void test7()

{

cout << "二叉树的深度为:" << depth(T) << endl;

}

void test8()

{

int dist = depth(T);

vector ne;

cout << "树根到叶子的最长路径:" << endl;

LongestPath(dist,1,ne,T);

_back(T->data);

reverse((),());

cout << ne[0];

for(int i = 1;i < ();i++)

}

cout << "->" << ne[i];

cout << endl;

void test9()

{

swapVer(T);

cout << "操作成功!" << endl;

}

void test10()

{

memset(SqBiTree,' ',sizeof SqBiTree);

createBiTree2(T,0);

cout << "操作成功!" << endl;

}

void test11()

{

int n = sumOfVer(T);

outputBiTree2(n);

}

int main()

{

int op = 0;

while(op != 12)

{

cout << "-----------------menu--------------------" << endl;

cout << "--------------1:创建二叉树--------------" << endl;

cout << "--------------2:前序遍历----------------" << endl;

cout << "--------------3:中序遍历----------------" << endl;

cout << "--------------4:后序遍历----------------" << endl;

cout << "--------------5:总结点数----------------" << endl;

cout << "--------------6:叶子节点数--------------" << endl;

cout << "--------------7:树的深度----------------" << endl;

cout << "--------------8:树根到叶子的最长路径----" << endl;

cout << "--------------9:交换所有节点左右子女----" << endl;

cout << "--------------10:顺序存储---------------" << endl;

cout << "--------------11:显示顺序存储-----------" << endl;

cout << "--------------12:退出测试程序-----------" << endl;

cout << "请输入指令编号:" << endl;

if(!(cin >> op))

{

();

(INT_MAX,'n');

}

cout << "请输入整数!" << endl;

continue;

switch(op)

{

case 1:

test1();

break;

test2();

break;

test3();

break;

test4();

break;

test5();

break;

test6();

break;

test7();

break;

test8();

break;

test9();

break;

test10();

break;

test11();

break;

cout << "测试结束!" << endl;

break;

cout << "请输入正确的指令编号!" << endl;

case 2:

case 3:

case 4:

case 5:

case 6:

case 7:

case 8:

case 9:

case 10:

case 11:

case 12:

default:

}

}

return 0;

}

六、 实验数据及处理结果

测试用例:

1. 创建二叉树(二叉链表形式)

2. 前序遍历

3. 中序遍历

4. 后序遍历

5. 总结点数

6. 叶子结点数

7. 树的深度

8. 树根到叶子的最长路径

9. 交换所有左右子女

10. 顺序存储

七、 思考讨论题或体会或对改进实验的建议

通过这次实验,我掌握了二叉树的顺序存储和链式存储,体会了二叉树的存储结构的特性,掌握了二叉树的树上相关操作。

八、 参考资料

《数据结构(C语言版)》 严蔚敏,吴伟民著

数据结构实验报告-树(二叉树)

本文发布于:2024-02-07 15:47:25,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170729204565344.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:二叉树   实验   结构   遍历   结点   输入   关系   具有
留言与评论(共有 0 条评论)
   
验证码:
排行榜

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23