实验五-二叉树基本操作的编程实现实验分析报告

合集下载

数据结构-实验五-二叉树的操作

数据结构-实验五-二叉树的操作

数据结构实验报告实验五二叉树的操作班级:12卓越6班学号:***********名:***任课教师:***计算机与信息工程学院2014年5月13 日实验五二叉树的操作一、实验目的1.进一步掌握指针变量、动态变量的含义;2.掌握二叉树的结构特征,以及各种存储结构的特点及适用范围;3.掌握用指针类型描述、访问和处理二叉树的运算。

二、实验要求1.按实验内容编写实验的程序,主程序以菜单形式运行。

2.上机调试运行本程序。

3.保存和打印出程序的运行结果,并结合程序进行分析。

4.提交源程序和运行结果。

三、实验内容1.创建以二叉链表作存储结构的二叉树;2.按中序遍历二叉树;3.按层次遍历二叉树;4.计算二叉树的单枝结点数;5.交换二叉树的左右子树。

解://声明类BiTree及定义结构BiNode,文件名为bitree.h#ifndef BITREE_H#define BITREE_H//int num;template <class T>struct BiNode //二叉树的结点结构{T data;BiNode<T> *lchild, *rchild;};template <class T>class BiTree{public:BiTree( ); //构造函数,初始化一棵二叉树,其前序序列由键盘输入~BiTree(void); //析构函数,释放二叉链表中各结点的存储空间BiNode<T>* Getroot(); //获得指向根结点的指针void PreOrder(BiNode<T> *root); //前序遍历二叉树void InOrder(BiNode<T> *root); //中序遍历二叉树void PostOrder(BiNode<T> *root); //后序遍历二叉树void LeverOrder(BiNode<T> *root); //层序遍历二叉树int depth(BiNode<T> *root); //求二叉树的深度void nodenum(BiNode<T> *root); //求二叉树的结点个数void leafnum(BiNode<T> *root); //求二叉树的叶子结点个数void empty( ); //判断二叉树是否为空int printnum( ); // 输出(全部、叶子或单分支)结点数void sbnodenum(BiNode<T> *root); //求二叉树的单分支结点个数void exchangetree(BiNode<T> *root); //交换二叉树的左右子树private:BiNode<T> *root; //指向根结点的头指针BiNode<T> *p;BiNode<T> *Creat( ); //有参构造函数调用void Release(BiNode<T> *root); //析构函数调用int num;};#endif//定义类中的成员函数,文件名为bitree.cpp#include<iostream>#include<string>#include"bietree.h"using namespace std;/**前置条件:二叉树不存在*输入:无*功能:构造一棵二叉树*输出:无*后置条件:产生一棵二叉树*/template<class T>BiTree<T>::BiTree( ){this->num=0;this->root = Creat( );}/**前置条件:二叉树已存在*输入:无*功能:释放二叉链表中各结点的存储空间*输出:无*后置条件:二叉树不存在*/template<class T>BiTree<T>::~BiTree(void){Release(root);}*前置条件:二叉树已存在*输入:无*功能:获取指向二叉树根结点的指针*输出:指向二叉树根结点的指针*后置条件:二叉树不变*/template<class T>BiNode<T>* BiTree<T>::Getroot( ){return root;}/**前置条件:二叉树已存在*输入:无*功能:前序遍历二叉树*输出:二叉树中结点的一个线性排列*后置条件:二叉树不变*/template<class T>void BiTree<T>::PreOrder(BiNode<T> *root) {if(root==NULL) return;else{cout<<root->data<<" ";PreOrder(root->lchild);PreOrder(root->rchild);}}*前置条件:二叉树已存在*输入:无*功能:中序遍历二叉树*输出:二叉树中结点的一个线性排列*后置条件:二叉树不变*/template <class T>void BiTree<T>::InOrder (BiNode<T> *root){if (root==NULL) return; //递归调用的结束条件else{InOrder(root->lchild); //中序递归遍历root的左子树cout<<root->data<<" "; //访问根结点的数据域InOrder(root->rchild); //中序递归遍历root的右子树}}/**前置条件:二叉树已存在*输入:无*功能:后序遍历二叉树*输出:二叉树中结点的一个线性排列*后置条件:二叉树不变*/template <class T>void BiTree<T>::PostOrder(BiNode<T> *root){if (root==NULL) return; //递归调用的结束条件else{PostOrder(root->lchild); //后序递归遍历root的左子树PostOrder(root->rchild); //后序递归遍历root的右子树cout<<root->data<<" "; //访问根结点的数据域}}/**前置条件:二叉树已存在*输入:无*功能:层序遍历二叉树*输出:二叉树中结点的一个线性排列*后置条件:二叉树不变*/template <class T>void BiTree<T>::LeverOrder(BiNode<T> *root){const int MaxSize = 100;int front = 0;int rear = 0; //采用顺序队列,并假定不会发生上溢BiNode<T>* Q[MaxSize];BiNode<T>* q;if (root==NULL) return;else{Q[rear++] = root;while (front != rear){q = Q[front++];cout<<q->data<<" ";if (q->lchild != NULL) Q[rear++] = q->lchild;if (q->rchild != NULL) Q[rear++] = q->rchild;}}}/**前置条件:空二叉树*输入:数据ch;*功能:初始化一棵二叉树,构造函数调用*输出:无*后置条件:产生一棵二叉树*/template <class T>BiNode<T>* BiTree<T>::Creat( ){BiNode<T>* root;T ch;cout<<"请输入创建一棵二叉树的结点数据"<<endl;cin>>ch;if (ch=="#") root = NULL;else{root = new BiNode<T>; //生成一个结点root->data=ch;root->lchild = Creat( ); //递归建立左子树root->rchild = Creat( ); //递归建立右子树}return root;}/**前置条件:二叉树已经存在*输入:无*功能:释放二叉树的存储空间,析构函数调用*输出:无*后置条件:二叉树不存在*/template<class T>void BiTree<T>::Release(BiNode<T>* root){if (root != NULL){Release(root->lchild); //释放左子树Release(root->rchild); //释放右子树delete root;}}/**前置条件:二叉树已经存在*输入:无*功能:求二叉树的深度*输出:二叉树的深度*后置条件:二叉树不变*/template<class T>int BiTree<T>::depth(BiNode<T> *root){int n,m;if(root==NULL) return 0;else{n=depth(root->lchild); //左子树的深度m=depth(root->rchild); //右子树的深度if (n>m)return n+1;elsereturn m+1;}}/**前置条件:二叉树已经存在*输入:无*功能:求二叉树的结点个数*输出:二叉树的结点个数*后置条件:二叉树不变*/template<class T>void BiTree<T>::nodenum(BiNode<T> *root){if(root==NULL) return;else{num++;nodenum(root->lchild); //左子树的结点个数nodenum(root->rchild); //右子树的结点个数}}*前置条件:二叉树已经存在*输入:无*功能:求二叉树2 的叶子结点个数*输出:二叉树的叶子结点个数*后置条件:二叉树不变*/template<class T>void BiTree<T>::leafnum(BiNode<T> *root){if(root==NULL) return;else{if(!(root->lchild) && !(root->rchild)) //判断是否为叶子结点num++;leafnum(root->lchild); //左子树中的叶子结点个数leafnum(root->rchild); //右子树中的叶子结点个数}}/*将全局变量num初始化为0*/template<class T>void BiTree<T>::empty( ){num=0;}输出全局变量num的值*/template<class T>int BiTree<T>::printnum( ){return num;}/**前置条件:二叉树已经存在*输入:无*功能:求二叉树的单分支结点个数*输出:二叉树的单分支结点个数*后置条件:二叉树不变*/template<class T>void BiTree<T>::sbnodenum(BiNode<T> *root){if(root==NULL) return;else{if((!(root->lchild) && (root->rchild))||((root->lchild) && !(root->rchild))) //判断是否为叶子结点num++;sbnodenum(root->lchild); //左子树中的叶子结点个数sbnodenum(root->rchild); //右子树中的叶子结点个数}}/**前置条件:二叉树已经存在*输入:无*功能:交换二叉树的左右子树*输出:无*后置条件:二叉树左右子树交换*/template<class T>void BiTree<T>::exchangetree(BiNode<T> *root){if(root==NULL) return;else{if((root->rchild)&&(root->lchild)) //判断左右叶子结点都存在{ p=root->lchild;root->lchild=root->rchild;root->rchild=p;}exchangetree(root->lchild); //左子树中的叶子结点个数exchangetree(root->rchild); //右子树中的叶子结点个数}}/* BiNode<T> * Q[20];BiNode<T> *q;int front=-1;int rear=-1;int n=0;int m=0;Q[++rear]=root;if(root==NULL)cout<<0;else{while(front!=rear){q=Q[++front];if(q->lchild==NULL && q->rchild!=NULL)m++;if(q->lchild!=NULL && q->rchild==NULL)n++;if(q->lchild!=NULL) Q[++rear]=q->lchild;if(q->rchild!=NULL) Q[++rear]=q->rchild;}}cout<<"单分支节点的个数为:"<<m+n<<endl;*///二叉树的主函数,文件名为bitreemain.cpp#include<iostream>#include<string>#include"bietree.cpp"using namespace std;void main(){BiTree<string> bt; //创建一棵树BiNode<string>* root = bt.Getroot( ); //获取指向根结点的指针int s=-1;while(s!=0){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<<"0.退出"<<endl;cin>>s;switch(s){ case 1:bt.PreOrder(root);cout<<endl;break;case 2:bt.InOrder(root);cout<<endl;break;case 3:bt.PostOrder(root);cout<<endl;break;case 4:bt.LeverOrder(root);cout<<endl;break;case 5:cout<<"树的深度为:"<<bt.depth(root)<<endl;break;case 6:bt.empty();bt.leafnum(root);cout<<"叶子结点个数为:"<<bt.printnum()<<endl;break;case 7:bt.empty();bt.sbnodenum(root);cout<<"单分支结点个数为:"<<bt.printnum()<<endl;break;case 8:bt.empty();bt.exchangetree(root);cout<<"左右子树交换后的结果:";bt.PreOrder(root);cout<<endl;break;case 0:exit(0);}}}。

二叉树的各种基本操作实验报告

二叉树的各种基本操作实验报告
PostOrderTraverse1(bt->rchild);
printf("%2c",bt->data);
}
}
void LeverlOrderTraverse(BiTree bt)
{//层次遍历二叉树
SqQueue Q;
BiTree p;
if(bt)
{
InitQueue(Q);
EnQueue(Q,bt);
{
printf("%2c",bt->data);
}
else
{
if(bt->lchild)
{
PutOutLeaf(bt->lchild);
}
if(bt->rchild)
{
PutOutLeaf(bt->rchild);
}
}
}
}
void CountNodes(BiTree bt,int &n)
{//输出总的节点数
printf("\n中序遍历二叉树非递归算法\n");
InOrderTraverse2(bt);
printf("\n后序遍历二叉树递归算法\n");
PostOrderTraverse1(bt);
printf("\n后序遍历二叉树非递归算法\n");
PostOrderTraverse2(bt);
printf("\n层次遍历二叉树\n");
if(bt)
{
n++;
CountNodes( bt->lchild,n);
CountNodes( bt->rchild,n);

二叉树基本操作--实验报告

二叉树基本操作--实验报告

//二叉树的结点个数 int NodesCount(BTNode *b){
if(b==NULL) return 0;
else return NodesCount(b->lchild)+NodesCount(b->rchild)+1;
}
//先序遍历递归 void PreOrder(BTNode *b){
switch(ch){ case '(':top++;St[top]=p;k=1;break; case ')':top--;break; case ',':k=2;break; default:p=(BTNode *)malloc(sizeof(BTNode));
p->data=ch;p->lchild=p->rchild=NULL; if(b==NULL)
BTNode *p; BTNode *qu[MaxSize]; int front,rear; front=rear=-1; rear++; qu[rear]=b; while(front!=rear){
front=(front+1)%MaxSize; p=qu[front]; printf("%c",p->data); if(p->lchild!=NULL){
rear=(rear+1)%MaxSize; qu[rear]=p->lchild; } if(p->rchild!=NULL){ rear=(rear+1)%MaxSize; qu[rear]=p->rchild; } } }
void main()

实验五 二叉树基本操作的编程实现实验报告

实验五 二叉树基本操作的编程实现实验报告

HUBEI UNIVERSITY OF AUTOMOTIVE TECHNOLOGY Array
数据结构
实验五二叉树基本操作的编程实现
【实验目的】
内容:二叉树基本操作的编程实现
要求:
二叉树基本操作的编程实现(2学时,验证型),掌握二叉树的建立、遍历、插入、删除等基本操作的编程实现,也可以进一步编程实现查找等操作,存储结构主要采用顺序或链接结构。

也鼓励学生利用基本操作进行一些应用的程序设计。

【实验性质】
验证性实验(学时数:2H)
【实验内容】
以下的选题都可以作为本次实验的推荐题目
1.建立二叉树,并以前序遍历的方式将结点内容输出。

2.将一个表示二叉树的数组结构转换成链表结构。

3.将表达式二叉树方式存入数组,以递归方式建立表达式之二叉树状结构,再分别输出前序、中序
及后序遍历结果,并计算出表达式之结果。

【注意事项】
1.开发语言:使用C。

2.可以自己增加其他功能。

【实验分析、说明过程】
【思考问题】
【实验小结】 (总结本次实验的重难点及心得、体会、收获)
【附录-实验代码】。

二叉树的操作实验报告

二叉树的操作实验报告

二叉树的操作实验报告二叉树的操作实验报告引言二叉树是计算机科学中常用的数据结构,它具有良好的搜索性能和灵活的插入和删除操作。

本实验旨在通过实际操作,深入理解二叉树的基本操作和特性。

1. 二叉树的定义和基本概念二叉树是一种特殊的树状结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。

二叉树的节点由数据和指向左右子节点的指针组成。

根据节点的位置,可以将二叉树分为左子树、右子树和根节点。

2. 二叉树的遍历二叉树的遍历是指按照一定的顺序访问二叉树中的所有节点。

常用的遍历方式有前序遍历、中序遍历和后序遍历。

前序遍历先访问根节点,然后按照左子树、右子树的顺序遍历;中序遍历先访问左子树,然后根节点,最后右子树;后序遍历先访问左子树,然后右子树,最后根节点。

3. 二叉树的插入操作插入操作是将一个新节点插入到二叉树中的特定位置。

插入操作需要考虑节点的大小关系,小于当前节点则插入到左子树,大于当前节点则插入到右子树。

插入操作可以保持二叉树的有序性。

4. 二叉树的删除操作删除操作是将指定节点从二叉树中删除。

删除操作需要考虑被删除节点的子节点情况,如果被删除节点没有子节点,则直接删除;如果有一个子节点,则将子节点替代被删除节点的位置;如果有两个子节点,则选择被删除节点的后继节点或前驱节点替代被删除节点。

5. 二叉树的查找操作查找操作是在二叉树中搜索指定的节点。

二叉树的查找操作可以使用递归或迭代的方式实现。

递归方式会自动遍历整个二叉树,直到找到目标节点或遍历完整个树。

迭代方式则需要手动比较节点的值,并根据大小关系选择左子树或右子树进行进一步查找。

6. 二叉树的平衡性二叉树的平衡性是指左子树和右子树的高度差不超过1。

平衡二叉树可以提高搜索效率,避免出现极端情况下的性能下降。

常见的平衡二叉树有AVL树和红黑树。

7. 二叉树应用场景二叉树在计算机科学中有广泛的应用场景。

例如,文件系统的目录结构可以使用二叉树来表示;数据库中的索引结构也可以使用二叉树来实现。

二叉树的基本操作实验报告

二叉树的基本操作实验报告

二叉树的基本操作实验报告学号姓名实验日期 2012-12-26实验室计算机软件技术实验指导教师设备编号 401实验内容二叉树的基本操作一实验题目实现二叉树的基本操作的代码实现二实验目的1、掌握二叉树的基本特性2、掌握二叉树的先序、中序、后序的递归遍历算法3、通过求二叉树的深度、度为2的结点数和叶子结点数等算法三实习要求(1)认真阅读书上给出的算法(2)编写程序并独立调试四、给出二叉树的抽象数据类型ADT BinaryTree{//数据对象D:D是具有相同特性的数据元素的集合。

//数据关系R:// 若D=Φ,则R=Φ,称BinaryTree为空二叉树;// 若D?Φ,则R={H},H是如下二元关系;// (1)在D中存在惟一的称为根的数据元素root,它在关系H下无前驱; // (2)若D-{root}?Φ,则存在D-{root}={D1,Dr},且D1?Dr =Φ; // (3)若D1?Φ,则D1中存在惟一的元素x1,<root,x1>?H,且存在D1上的关系H1 ?H;若Dr?Φ,则Dr中存在惟一的元素xr,<root,xr>?H,且存在上的关系Hr ?H;H={<root,x1>,<root,xr>,H1,Hr};// (4)(D1,{H1})是一棵符合本定义的二叉树,称为根的左子树;(Dr,{Hr})是一棵符合本定义的二叉树,称为根的右子树。

//基本操作:CreateBiTree( &T, definition ) // 初始条件:definition给出二叉树T的定义。

// 操作结果:按definiton构造二叉树T。

BiTreeDepth( T )// 初始条件:二叉树T存在。

// 操作结果:返回T的深度。

PreOrderTraverse( T, visit() ) // 初始条件:二叉树T存在,Visit是对结点操作的应用函数。

[精品]【数据结构】二叉树实验报告

[精品]【数据结构】二叉树实验报告

[精品]【数据结构】二叉树实验报告二叉树实验报告一、实验目的:1.掌握二叉树的基本操作;2.理解二叉树的性质;3.熟悉二叉树的广度优先遍历和深度优先遍历算法。

二、实验原理:1.二叉树是一种树形结构,由n(n>=0)个节点组成;2.每个节点最多有两个子节点,称为左子节点和右子节点;3.二叉树的遍历分为四种方式:前序遍历、中序遍历、后序遍历和层次遍历。

三、实验环境:1.编程语言:C++;2.编译器:Dev-C++。

四、实验内容:1.定义二叉树节点结构体:struct BinaryTreeNode{int data; // 节点数据BinaryTreeNode *leftChild; // 左子节点指针BinaryTreeNode *rightChild; // 右子节点指针};2.初始化二叉树:queue<BinaryTreeNode *> q; // 使用队列存储节点q.push(root);int i = 1; // 创建子节点while (!q.empty() && i < length){BinaryTreeNode *node = q.front();q.pop();if (data[i] != -1) // 创建左子节点 {BinaryTreeNode *leftChild = new BinaryTreeNode;leftChild->data = data[i];leftChild->leftChild = nullptr;leftChild->rightChild = nullptr;node->leftChild = leftChild;q.push(leftChild);}i++;if (data[i] != -1) // 创建右子节点 {BinaryTreeNode *rightChild = new BinaryTreeNode;rightChild->data = data[i];rightChild->leftChild = nullptr;rightChild->rightChild = nullptr;node->rightChild = rightChild;q.push(rightChild);}i++;}return root;}3.前序遍历二叉树:五、实验结果:输入:int data[] = {1, 2, 3, 4, -1, -1, 5, 6, -1, -1, 7, 8};输出:前序遍历结果:1 2 4 5 3 6 7 8中序遍历结果:4 2 5 1 6 3 7 8后序遍历结果:4 5 2 6 8 7 3 1层次遍历结果:1 2 3 4 5 6 7 8通过本次实验,我深入理解了二叉树的性质和遍历方式,并掌握了二叉树的基本操作。

C 二叉树基本操作实验报告

C  二叉树基本操作实验报告
s.push(p); p=p->l; } if(!s.empty()) { p=s.top(); cout<<p->data<<" "; s.pop(); p=p->r; } } } void BL3(ECS_data *t)//递归后序遍历 { if(NULL!=t) { BL3(t->l); BL3(t->r); cout<<t->data<<","; } } void postOrder3(ECS_data *t) //非递归后序遍历 { stack<ECS_data*> s; ECS_data *cur; //当前结点 ECS_data *pre=NULL; //前一次访问的结点
(pre!=NULL&&(pre==cur->l||pre==cur->r))) {
cout<<cur->data<<" "; //如果当前结点没有孩子结点或者孩 子节点都已被访问过
s.pop(); pre=cur; } else { if(cur->r!=NULL)
s.push(cur->r); if(cur->l!=NULL)
CountLeaf(t->l);//递归统计左子树叶子数目 CountLeaf(t->r);//递归统计右子树叶子数目 } } return LeafNum; }
五、运行结果
附:完整程序源代码:
//二叉树链式存储的实现
#include<iostream> #include<cstring> #include <stack> using namespace std;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验五-二叉树基本操作的编程实现实验报告————————————————————————————————作者:————————————————————————————————日期:HUBEI UNIVERSITY OF AUTOMOTIVE TECHNOLOGY数据结构实验报告这里一定填写清楚自己实验项目实验五实验类别基础篇学生姓名朱忠栋学生学号20120231515完成日期2014-12-16指导教师付勇智实验成绩评阅日期评阅教师实验五二叉树基本操作的编程实现【实验目的】内容:二叉树基本操作的编程实现要求:二叉树基本操作的编程实现(2学时,验证型),掌握二叉树的建立、遍历、插入、删除等基本操作的编程实现,也可以进一步编程实现查找等操作,存储结构主要采用顺序或链接结构。

也鼓励学生利用基本操作进行一些应用的程序设计。

【实验性质】验证性实验(学时数:2H)【实验内容】以下的选题都可以作为本次实验的推荐题目1.建立二叉树,并以前序遍历的方式将结点内容输出。

2.将一个表示二叉树的数组结构转换成链表结构。

3.将表达式二叉树方式存入数组,以递归方式建立表达式之二叉树状结构,再分别输出前序、中序及后序遍历结果,并计算出表达式之结果。

【注意事项】1.开发语言:使用C。

2.可以自己增加其他功能。

【实验分析、说明过程】页面不够,可续页。

根据自己选择的层次不同的实验内容,完善程序代码,调试通过后,分析说明该问题处理的详细算法过程。

不需要写出详细的代码,只表达清楚详细的处理算法即可。

可以采用流程图、形式语言或者其他数学表达方式来说明。

这次实验考查的主要是:递归建立二叉树,递归输出先序,中序和后序遍历的结果;非递归建立二叉树,再以非递归方式分别输出先序,中序和后序遍历的结果。

而对于基础篇考查的主要是:递归建立二叉树,递归输出先序,中序和后序遍历的结果,是以填空的方式进行考查的。

对于第一空:递归实现的先序遍历,其实现方法是:printf("%d",p->data);if(p->lchild!=NULL) preorder(p->lchild);if(p->rchild!=NULL) preorder(p->rchild);对于第二空:递归实现的中序遍历,其实现方法是:if(p->lchild!=NULL) inorder(p->lchild);printf("%d",p->data);if(p->rchild!=NULL) inorder(p->rchild);对于第三空:递归实现的后序遍历,其实现方法是:if(p->lchild!=NULL) postorder(p->lchild);if(p->rchild!=NULL) postorder(p->rchild);printf("%d",p->data);【思考问题】页面不够,可续页。

1.二叉树是树吗?它的定义为什么是递归的?答:最多有两棵子树的有序树,称为二叉树。

二叉树是一种特殊的树。

具有n个结点的完全二叉树的深度为log2n +1 !!!二叉树的计算方法:若一棵二叉树为空,则其深度为0,<WBR>否则其深度等于左子树和右子树的最大深度加12.三种根序遍历主要思路是什么?答:大体思路差不多,但节点访问位置不一样,先序的话,是先访问,然后节点压栈,移到左子树,至节点空退栈,移到右子树。

而中序的话,是先节点压栈,移到左子树,至节点空退栈,访问节点,然后移到右子树。

另外,所谓前序、中序、后序遍历,全称是前根序遍历,中根序遍历,后根序遍历,不管哪种遍历,访问左子树一定在访问右子树之前,不同的就是根的访问时机。

所以三种递归/或非递归,程序思路都是一样的。

3.如果不用遍历算法一般启用什么数据结构实现后序遍历?答:用栈实现后序遍历。

4.举出二叉树的应用范例?答:一个集合的幂集、排列问题、组合问题【实验小结】 (总结本次实验的重难点及心得、体会、收获)页面不够,可续页。

在本次实验中我遇到了许多困难,终于我顺利地完成了它。

本次实验我收获良多,不仅仅是书本上的知识上的欠缺得到了补充,使我更好的掌握了本章的内容;在学习工作的品质方面也有了较大的进步。

总之这次实验,我认为是比较成功的。

在知识方面,通过这次实验我对树的相关知识进行了进一步的思考,使我对其有了全面而深入的认识,对其特点和应用也有了相应的了解。

尤其是在应用方面使我不在像以前一样拘泥于学,而忽视用的重要性。

一个合格的学习者,必定是一个善于学以致用的学习者,这样的学习者不仅仅会学习,还会用自己所学创造价值,是自己所学的知识实现其应有的价值,而不是消化在肚子里。

在对今后发展方面,通过本次实验我明白了任何事都不是一蹴而就的,只有经过不断的钻研,反复的实验改进才可能得到自己想要的结果。

经历失败不可怕,可怕的是没有这个过程,只要有了这个过程,就算一时没有成功,但是我相信最终一定会成功的。

不是不会成功,只是还没有成功而已——你正在走向成功的道路上。

等经过了这一段探究的历程,你必定会获得你渴望已久的成功。

【附录-实验代码】页面不够,可续页。

这个代码必须是调试通过,没有问题的最终代码。

#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<iostream.h>#define MAXSIZE 100typedef char elemtype;typedef struct bitree{elemtype data;struct bitree *lchild,*rchild;}BTREE;BTREE *create(){//先序递归创建二叉树char ch;BTREE *bt;ch=getchar();if(ch=='#')bt=NULL;else{bt=(BTREE *)malloc(sizeof(BTREE));bt->data=ch;bt->lchild=create(); //递归创建左子树bt->rchild=create(); //递归创建右子树}return(bt);}void preorder(BTREE *root){//递归实现的先序遍历BTREE *p;p=root;if(p!=NULL){printf("%d",p->data);if(p->lchild!=NULL) preorder(p->lchild);if(p->rchild!=NULL) preorder(p->rchild);}}void inorder(BTREE *root){//递归实现的中序遍历BTREE *p;if(p!=NULL){if(p->lchild!=NULL) inorder(p->lchild);printf("%d",p->data);if(p->rchild!=NULL) inorder(p->rchild);}}void postorder(BTREE *root){//递归实现的后序遍历BTREE *p;p=root;if(p!=NULL){if(p->lchild!=NULL) postorder(p->lchild);if(p->rchild!=NULL) postorder(p->rchild);printf("%d",p->data);}}void lorder(BTREE *root){//非递归实现的层次遍历BTREE *q[MAXSIZE],*p; // maxsize为最大容量int f,r; // f,r类似于头尾指针q[1]=root;f=r=1;while(f<=r){p=q[f];f++; //出队printf("%c",p->data);if(p->lchild!=NULL){r++;q[r]=p->lchild;} //入队if(p->rchild!=NULL){r++;q[r]=p->rchild;} //入队}}void showmenu()printf(" 欢迎使用二叉树操作演示软件\n");printf("\t1、创建二叉树\n");printf("\t2、先序遍历二叉树\n");printf("\t3、中序遍历二叉树\n");printf("\t4、后序遍历二叉树\n");printf("\t5、层次遍历二叉树\n");printf("\t6、退出程序\n");}void main(){BTREE *root=NULL;int no;while(1){showmenu();printf(" 请输入你的选择:");scanf("%d",&no);fflush(stdin);//清除键盘缓冲区switch(no){case 1:printf("请按先序依次输入二叉树的结点,\n");printf("空结点用#号表示.\n");root=create();printf("二叉树创建成功,按任意键继续…\n");getch();system("cls");break;case 2:printf("二叉树先序遍历结果为:\n");preorder(root);printf("\n");system("pause");system("cls");break;case 3:printf("二叉树中序遍历结果为:\n");inorder(root);printf("\n");system("pause");system("cls");break;case 4:printf("二叉树后序遍历结果为:\n");postorder(root);printf("\n");system("pause");system("cls");break;case 5:printf("二叉树层次遍历结果为:\n");lorder(root);printf("\n");system("pause");system("cls");break;case 6:return;default:printf("你的输入有误,请从新输入!\n");system("pause");system("cls");}}}。

相关文档
最新文档