数据结构实验报告(五)

来源:互联网 发布:汽车修理厂软件手机版 编辑:程序博客网 时间: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;}

五、运行与测试结果



六、总结与心得

算法效率分析:

二叉树的递归算法较简单,代码简洁清晰,但递归算法效率低,执行速度慢。

总结:

该程序主要是在链表形式上加以改造完成的,通过参考课本,能较容易地完成该实验内容。在实验过程中,我也遇到挺多触不及防的问题,如在输出结点、双亲和左右孩子的信息时,对双亲的判断不知道从何下手。后来我发现可以通过增加一个参数来完成,避免了不必要的麻烦。此外,我还遇到不知该如何输入有效数据导致运行一直没结果的问题,经过分析我发现需要输入一棵扩展二叉树的前序遍历序列,系统才能有效识别该二叉树。通过自己发现问题解决问题,收获了很多,也发现了自己考虑不全面周到的问题,希望下次能加以改正。

原创粉丝点击