数据结构实验报告(五)
来源:互联网 发布:汽车修理厂软件手机版 编辑:程序博客网 时间:2024/05/29 07:59
数据结构实验报告(五)
一、实验名称
实验五 树和二叉树的实验2
二、 实验目的
1、 熟练理解树和二叉树的相关概念,掌握的存储结构和相关操作实现;
2、 掌握树的顺序结构的实现;
3、 学会运用树的知识解决实际问题
三、 实验内容
自己确定一个二叉树(树结点类型、数目和结构自定)利用链式存储结构方法存储。实现树的构造,并完成:
1) 用前序遍历、中序遍历、后序遍历输出结点数据;
2) 以合理的格式,输出各个结点和双亲、孩子结点信息;
3) 输出所有的叶子结点信息;
四、详细设计(C++)
1. 算法设计
1.定义BiTree类,树结点的数据类型为字符型。
2.定义构造函数、析构函数、遍历函数、PLM输出各个结点和双亲、孩子结点信息、LM输出所有的叶子结点信息。
3.为了避免类的调用者访问BiTree类的私有变量root,在构造函数、析构函数以及遍历函数中调用了相应的私有函数。
4.遍历操作采用递归算法
构造函数:
输入根结点,若输入的是“#”字符,则表明该二叉树为空树,即bt=NULL;否则输入的字符应该赋给bt->data,之后依次递归建立它的左子树和右子树。
析构函数:
二叉链表属于动态存储分配,需要在析构函数中释放二叉链表中的所有结点。在释放某结点时,该结点的左、右子树都已经释放,所以,应该采用后序遍历,当访问某结点时将该结点的存储空间释放。
2.源程序代码
#include<iostream>using namespace std;struct BiNode{char data;BiNode *lchild,*rchild;};class BiTree{public:BiTree(){root=Creat(root);}~BiTree(){Release(root);}void PreOrder(){PreOrder(root);}void InOrder(){InOrder(root);}void PostOrder(){PostOrder(root);}void PCM(){PCM(root,NULL);}void LM(){LM(root);}private:BiNode *root;BiNode *Creat(BiNode *bt);void Release(BiNode *bt);void PreOrder(BiNode *bt);void InOrder(BiNode *bt);void PostOrder(BiNode *bt);void PCM(BiNode *bt,BiNode *p);void LM(BiNode *bt);};BiNode *BiTree::Creat(BiNode *bt){char ch;cin>>ch;if(ch=='#')bt=NULL;else{bt=new BiNode;bt->data=ch;bt->lchild=Creat(bt->lchild);bt->rchild=Creat(bt->rchild);}return bt;}void BiTree::Release(BiNode *bt){if(bt!=NULL){Release(bt->lchild);Release(bt->rchild);delete bt;}}void BiTree::PreOrder(BiNode *bt){if(bt==NULL) return;else{cout<<bt->data<<" ";PreOrder(bt->lchild);PreOrder(bt->rchild);}}void BiTree::InOrder(BiNode *bt){if(bt==NULL)return;else{InOrder(bt->lchild);cout<<bt->data<<" ";InOrder(bt->rchild);}}void BiTree::PostOrder(BiNode *bt){if(bt==NULL) return;else{PostOrder(bt->lchild);PostOrder(bt->rchild);cout<<bt->data<<" ";}}void BiTree::PCM(BiNode *bt,BiNode *p){if(bt==NULL) return;else{cout<<"结点为:"<<bt->data<<endl;if(p!=NULL)cout<<"双亲为:"<<p->data<<endl;else cout<<"无双亲!"<<endl;if(bt->lchild!=NULL)cout<<"左孩子为:"<<bt->lchild->data<<endl;elsecout<<"无左孩子!"<<endl;if(bt->rchild!=NULL)cout<<"右孩子为:"<<bt->rchild->data<<endl;elsecout<<"无右孩子!"<<endl;cout<<endl;PCM(bt->lchild,bt);PCM(bt->rchild,bt);}}void BiTree::LM(BiNode *bt){if(bt!=NULL){if(bt->lchild==NULL&&bt->rchild==NULL)cout<<bt->data<<" ";LM(bt->lchild);LM(bt->rchild);}}int main(){cout<<"请输入创建一棵二叉树的所有结点数据:";BiTree BT;cout<<endl;cout<<"前序遍历:"<<endl;BT.PreOrder();cout<<endl;cout<<"中序遍历:"<<endl;BT.InOrder();cout<<endl;cout<<"后序遍历:"<<endl;BT.PostOrder();cout<<endl;cout<<endl;BT.PCM();cout<<endl;cout<<"所有叶子结点为:";BT.LM();cout<<endl;system("pause");return 0;}
五、运行与测试结果
六、总结与心得
算法效率分析:
二叉树的递归算法较简单,代码简洁清晰,但递归算法效率低,执行速度慢。
总结:
该程序主要是在链表形式上加以改造完成的,通过参考课本,能较容易地完成该实验内容。在实验过程中,我也遇到挺多触不及防的问题,如在输出结点、双亲和左右孩子的信息时,对双亲的判断不知道从何下手。后来我发现可以通过增加一个参数来完成,避免了不必要的麻烦。此外,我还遇到不知该如何输入有效数据导致运行一直没结果的问题,经过分析我发现需要输入一棵扩展二叉树的前序遍历序列,系统才能有效识别该二叉树。通过自己发现问题解决问题,收获了很多,也发现了自己考虑不全面周到的问题,希望下次能加以改正。
- 数据结构实验报告(五)
- 《数据结构》实验五:树和二叉树 实验(实验报告)
- 《数据结构》实验五: 树和二叉树实验报告
- 数据结构实验报告(一)
- 数据结构实验报告(三)
- 数据结构实验报告(四)
- 数据结构实验报告(六)
- 实验五:实验报告
- 《数据结构》实验二线性表实验(实验报告)
- 《数据结构》实验二:线性表的实验(实验报告)
- 《数据结构》实验三:栈和队列实验 (实验报告)
- 第十周实验报告(五)
- 第十周实验报告(五)
- C++程序设计实验报告(五)
- 第六周实验报告(五)
- 第六周实验报告(五)
- 第九周实验报告(五)
- 第九周实验报告(五)
- Android中各种Span的用法
- c++栈和java栈的区别
- Hbuilder开启less自动编译的方法
- 【Linux】Linux下基本指令
- 怎么给a标签或者链接添加单击事件
- 数据结构实验报告(五)
- Sinner控件动态获取下拉类别
- Error mounting /dev/sda1 at /media/XXXX: Command-line `mount -t "ntfs" -o
- *数组总结*
- HashMap的工作原理
- 架构师之路:Mycat分布式架构实战解析
- LayaAir 使用方向键 控制精灵在格子中移动
- C语言操作符总结
- etcd单机启动