您好,欢迎来到化拓教育网。
搜索
您的当前位置:首页数据结构实验报告-二叉树

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

来源:化拓教育网


数据结构 上机实验报告

学号:姓名: 所在系:计算机科学与技术 班级:

实验名称: 二叉树的基本应用 实验日期 2018.11.9 实验指导教师 实验机房 ------------------------------------------------------------------------------------------------------

1. 实验目的:

(1)理解树这种数据结构。

(2)掌握二叉树二叉链表这种存储结构。 (3)完成二叉树各种基本运算的算法。

2. 实验内容:

(1)实现二叉树创建的算法。 (2)实现二叉树各种遍历算法。

(3)实现二叉树其他操作的算法,包括:统计叶子结点的个数、求二叉树的深度、线索二叉树等。

3. 算法设计(编程思路或流程图)

1) 二叉树创建的算法

BiTNode.h:

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.

#include #include using namespace std; #define MAX 20 #define OK 1 #define ERROR 0 #define NULL 0 #define OVERFLOW 0 typedef char TElemType; typedef struct BiTNode { TElemType data;

struct BiTNode*lchild, *rchild; }BiTNode,*BiTree;

//先序创建二叉树

BiTree createBiTree(BiTree t) { TElemType data; cin >> data; if (data == '#') { t = NULL;

21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51.

} else {

t = new BiTNode; if (!t) {

return OVERFLOW; }

t->data = data;

t->lchild = createBiTree(t->lchild); t->rchild = createBiTree(t->rchild); }

return t; }

//层序遍历二叉树

void levelOrder(BiTree t) { queue q;

if (t) {//如果根节点非空,则根节点入队列 q.push(t);

while (!q.empty()) {//循环遍历,出队列的同时,左右孩子入队尾 BiTree temp = q.front(); q.pop();

cout <data<< endl; if (temp->lchild) { q.push(temp->lchild); }

if(temp->rchild) { q.push(temp->rchild); } } } }

main.cpp:

1. 2. 3. 4. 5. 6. 7. 8. 9. 10.

#include \"BiTNode.h\"

int main(){ BiTree t=NULL;

cout << \"***************采用递归函数构造一个二叉树 cout << \"请输入二叉树的字符序列:\"; if (t = createBiTree(t)) {

cout << \"二叉树创建成功!现在层序输出:\" << endl; levelOrder(t); }

********************\" << endl;

11. 12. 13. 14. 15.

else {

cout << \"很遗憾创建二叉树失败!\" << endl; }

return 0; }

2) 二叉树各种遍历算法

BiTNode.h:

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36.

#include #include using namespace std; #define MAX 20 #define OK 1 #define ERROR 0 #define NULL 0 #define OVERFLOW 0 typedef char TElemType; typedef struct BiTNode { TElemType data;

struct BiTNode*lchild, *rchild; }BiTNode,*BiTree;

//先序创建二叉树

BiTree createBiTree(BiTree t) { TElemType data; cin >> data; if (data == '#') { t = NULL; } else {

t = new BiTNode; if (!t) {

return OVERFLOW; }

t->data = data;

t->lchild = createBiTree(t->lchild); t->rchild = createBiTree(t->rchild); }

return t; }

//层序遍历二叉树

void levelOrder(BiTree t) { queue q;

37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. . 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78.

if (t) {//如果根节点非空,则根节点入队列 q.push(t);

while (!q.empty()) {//循环遍历,出队列的同时,左右孩子入队尾 BiTree temp = q.front(); q.pop();

cout <data<<\" \"; if (temp->lchild) { q.push(temp->lchild); }

if(temp->rchild) { q.push(temp->rchild); } } } }

//先序遍历

void preOrder(BiTree t) { if (t == NULL) { return; }

cout << t->data<<\" \"; preOrder(t->lchild); preOrder(t->rchild); }

//中序遍历

void inOrder(BiTree t) { if (t == NULL) { return; }

inOrder(t->lchild); cout << t->data<<\" \"; inOrder(t->rchild); }

//后序遍历

void postOrder(BiTree t) { if (t == NULL) { return; }

postOrder(t->lchild); postOrder(t->rchild); cout << t->data << \" \"; }

Main.cpp:

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.

#include \"BiTNode.h\"

int main(){ BiTree t=NULL;

cout << \"***************采用递归函数构造一个二叉树 cout << \"请输入二叉树的字符序列:\"; if (t = createBiTree(t)) {

cout << \"二叉树创建成功!\" << endl; cout << \"先序遍历:\" << endl; preOrder(t);

cout << \"\\n中序遍历:\" << endl; inOrder(t);

cout << \"\\n后序遍历:\" << endl; postOrder(t);

cout << \"\\n层序遍历:\" << endl; levelOrder(t); } else {

cout << \"很遗憾创建二叉树失败!\" << endl; }

return 0; }

********************\" << endl;

3) 叶子结点统计的算法

创建二叉树的算法在前面实验中已经写过,这里只写计算叶子结点数的算法: 在BiTNode.h中添加以下内容:

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.

//计算叶子节点 int leafNumber = 0;

void getLeafNumber(BiTree t) { if (t) {

if (t->lchild == NULL && t->rchild == NULL) { leafNumber++;

cout<<\"叶子节数据:\" << t->data << endl; }

getLeafNumber(t->lchild); getLeafNumber(t->rchild); } }

Main.cpp:

1.

#include \"BiTNode.h\"

2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.

int main() {

BiTree t = NULL;

cout << \"***************采用递归函数构造一个二叉树 cout << \"请输入二叉树的字符序列:\"; if (t = createBiTree(t)) {

cout << \"二叉树创建成功!\" << endl; getLeafNumber(t);

cout << \"这棵二叉树的叶子节点有\" << leafNumber << \"个。 } else {

cout << \"很遗憾创建二叉树失败!\" << endl; }

return 0; }

********************\" << endl;

\" << endl;

4) 二叉树深度统计算法

同理,这里只写统计深度的算法和main.cpp中的内容:

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.

//二叉树深度统计

int getMaxLevel(BiTree t) { int dep1=0, dep2=0; if (t) {

dep1 = getMaxLevel(t->lchild); dep2 = getMaxLevel(t->rchild);

return dep1 > dep2 ? dep1 + 1 : dep2 + 1; } else { return 0; } }

Main.cpp:

1. 2. 3. 4. 5. 6. 7. 8.

#include \"BiTNode.h\" int main() {

BiTree t = NULL;

cout << \"***************采用递归函数构造一个二叉树 cout << \"请输入二叉树的字符序列:\"; if (t = createBiTree(t)) {

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

cout <<\"这棵二叉树的深度是:\"<< getMaxLevel(t) << endl;

********************\" << endl;

9. 10. 11. 12. 13. 14.

} else {

cout << \"很遗憾创建二叉树失败!\" << endl; }

return 0; }

4.程序调试(实验数据记录——根据程序要求输入几组不同数据,记录程序运行

结果,并分析结果,分析程序运行中出现的主要错误。或对其他程序环境的使用情况的记录。注:必须认真书写)

1) 二叉树创建的算法

测试如下二叉树:

图1-1

实验结果:

2) 二叉树各种遍历算法

测试二叉树如下:

图2-1

建立二叉树时应该对应输入:a b d h # # i # # e # j # # c f # k # # g # # 运行结果:

3) 叶子结点统计的算法

测试图2-1中的二叉树,结果为:

4) 二叉树深度统计算法

仍然测试图2-1的二叉树:

5.讨论(通过实验的一些体会、学会的知识和技能等)

1) 二叉树创建的算法

关于二叉树的创建,首先为了能让每个结点确认是否有左右孩子,我们对它进行了扩展,也就是将二叉树中每个结点的空指针引出一个虚结点,其值为一特定值,比如“#”。我们称这种处理后的二叉树为原二叉树的扩展二叉树。扩展二叉树就可以做到一个遍历序列确定一棵二叉树了。上面的实验用了先序遍历来创建而二叉树,就首先要写出扩展二叉树的先序遍历序列,然后从键盘上输入序列就可以创建二叉树了。

在层序遍历二叉树的时候用到了队列的知识,在c++头文件queue中封装了队列,直接引入头文件就可以来使用队列,通过Queue<>就可以创建对象,利用队列的性质,实现层序遍历二叉树。 2) 二叉树各种遍历算法

二叉树的遍历主要分为四种:前序遍历,中序遍历,后序遍历以及层序遍历。下面简述一下上面程序主要运用的思想:前序遍历:若树为空,则空操作返回。否则,先访问根节点,然后前序遍历左子树,再前序遍历右子树。中序遍历:若树为空,则空操作返回。否则,从根节点开始(注意并不是先访问根节点),中序遍历根节点的左子树,然后是访问根节点,最后中序遍历根节点的右子树。后序遍历:若树为空,则空操作返回。否则,从左到右先叶子后节点的方式遍历访问左右子树,最后访问根节点。层序遍历:若树为空,则空操作返回。否则,从树的第一层,也就是根节点开始访问,从上到下逐层遍历,在同一层中,按从左到右的顺序结点逐个访问。 3) 叶子结点统计的算法

统计叶子节点的算法设计与二叉树的几种遍历方法是分不开的,在本次实验中,采用先序遍历统计二叉树的叶子数,由于如果一个节点是叶子的话,其左右孩子均为空,所以可用左右孩子均为空的方法来判断是否为叶子节点,然后定义全局变量统计叶子节点即可。

4) 二叉树深度统计算法

求二叉树的深度算法实际上是递归的应用,运用递归找到二叉树的叶子各个叶子节点,并加以比较,找到最“深”的那个叶子节点,即为二叉树的深度。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo9.cn 版权所有 赣ICP备2023008801号-1

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务