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

合集下载

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

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

数据结构实验报告实验五二叉树的操作班级: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、分析、理解程序程序的功能是采用二叉树链表存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作。

如输入二叉树ABD###CE##F##,链表示意图如下:2、添加中序和后序遍历算法//========LNR 中序遍历===============void Inorder(BinTree T){if(T){Inorder(T->lchild);printf("%c",T->data);Inorder(T->rchild);}}//==========LRN 后序遍历============void Postorder(BinTree T){if(T){Postorder(T->lchild);Postorder(T->rchild);printf("%c",T->data);}}3、调试程序,设计一棵二叉树,输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##,建立二叉树,求出先序、中序和后序以及按层次遍历序列,求所有叶子及结点总数。

(1)输入完全二叉树的先序序列ABD###CE##F##,程序运行结果如下:(2)先序序列:(3)中序序列:(4)后序序列:(5)所有叶子及结点总数:(6)按层次遍历序列:四、源程序代码#include"stdio.h"#include"string.h"#include"stdlib.h"#define Max 20 //结点的最大个数typedef struct node{char data;struct node *lchild,*rchild;}BinTNode; //自定义二叉树的结点类型typedef BinTNode *BinTree; //定义二叉树的指针int NodeNum,leaf; //NodeNum为结点数,leaf为叶子数//==========基于先序遍历算法创建二叉树==============//=====要求输入先序序列,其中加入虚结点"#"以示空指针的位置========== BinTree CreatBinTree(void){BinTree T;char ch;if((ch=getchar())=='#')return(NULL); //读入#,返回空指针else{T=(BinTNode *)malloc(sizeof(BinTNode)); //生成结点T->data=ch;T->lchild=CreatBinTree(); //构造左子树T->rchild=CreatBinTree(); //构造右子树return(T);}}//========NLR 先序遍历=============void Preorder(BinTree T){if(T) {printf("%c",T->data); //访问结点Preorder(T->lchild); //先序遍历左子树Preorder(T->rchild); //先序遍历右子树}}//========LNR 中序遍历===============void Inorder(BinTree T){if(T){Inorder(T->lchild);printf("%c",T->data);Inorder(T->rchild);}}//==========LRN 后序遍历============void Postorder(BinTree T){if(T){Postorder(T->lchild);Postorder(T->rchild);printf("%c",T->data);}}//=====采用后序遍历求二叉树的深度、结点数及叶子数的递归算法======== int TreeDepth(BinTree T){int hl,hr,max;if(T){hl=TreeDepth(T->lchild); //求左深度hr=TreeDepth(T->rchild); //求右深度max=hl>hr? hl:hr; //取左右深度的最大值NodeNum=NodeNum+1; //求结点数if(hl==0&&hr==0) leaf=leaf+1; //若左右深度为0,即为叶子。

实验五 数据结构 二叉树基本操作实验报告(汽院)

实验五 数据结构 二叉树基本操作实验报告(汽院)
数据结构(
班级:
教师批阅处:
一、实验名称
二叉树基本操作的编程实现
二、实验目的
二叉树基本操作的编程实现,掌握二叉树的建立、遍历、插入、删除等基本操作的编程实现,存储结构主要采用链接结构。
三、实验内容
本次实验的内容有三种模式,我选择了第三种模式:用c进行程序的改进和提高,把下面的程序源码进行输入和改写,调试,直到成功。
1、补充三种递归遍历的方法
先根遍历:若二叉树不为空,先访问根节点,然后访问根节点的左子树,最后访问根节点的右子树。
中根遍历:若二叉树不为空,先访问根节点的左子树,然后访问根节点,最后访问根节点的右子树。
后跟遍历:若二叉树不为空,先访问根节点的左子树,然后访问根节点的右子树,最后访问根节点。
三种遍历的效果截图如下:
{
if(pnow!=NULL)
{
if (top<Maxsize-1)
{
top++;
stack[top].link=pnow;
stack[top].flag=1;
pnow=pnow->lchild;
}
else
{ return overflow; }
}
else
{
pnow=stack[top].link;
cout<<",";
else
cout<<")";
pnow=NULL;
}
}
}
cout<<endl;
return success;
}
3、补充层次遍历的方法
若二叉树不为空,从根节点开始从上至下逐层访问,同一层中从左到右逐个结点访问。效果截图如下:

二叉树的各种基本运算的实现实验报告

二叉树的各种基本运算的实现实验报告

二叉树的各种基本运算的实现实验报告
一、实验目的
实验目的为了深入学习二叉树的各种基本运算,通过操作实现二叉树的建立、存储、查找、删除、遍历等各种基本运算操作。

二、实验内容
1、构造一个二叉树。

我们首先用一定的节点来构建一棵二叉树,包括节点的左子节点和右子节点。

2、实现查找二叉树中的节点。

在查找二叉树中的节点时,我们根据二叉树的特点,从根节点开始查找,根据要查找的节点的值与根节点的值的大小的关系,来决定接下来查找的方向,直到找到要查找的节点为止。

3、实现删除二叉树中的节点。

在删除二叉树节点时,我们要做的是找到要删除节点的父节点,然后让父节点的链接指向要删除节点的子节点,有可能要删除节点有一个子节点,有可能有两个极点,有可能没有子节点,我们要根据每种情况进行处理,来保持二叉树的结构不变。

4、对二叉树进行遍历操作。

二叉树的遍历有多种方法,本实验使用的是先序遍历。

首先从根节点出发,根据先序遍历的顺序,先访问左子树,然后再访问右子树,最后访问根节点。

三、实验步骤
1、构建二叉树:
我们用一个数组代表要构建的二叉树,第一项为根节点,第二项和第三项是根节点的子节点。

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

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

数据结构实验报告1. 实验目的和内容:掌握二叉树基本操作的实现方法2. 程序分析2.1存储结构链式存储2.程序流程2.3关键算法分析算法一:Create(BiNode<T>* &R,T data[],int i,int n)【1】算法功能:创建二叉树【2】算法基本思想:利用顺序存储结构为输入,采用先建立根结点,再建立左右孩子的方法来递归建立二叉链表的二叉树【3】算法空间时间复杂度分析:O(n)【4】代码逻辑:如果位置小于数组的长度则{ 创建根结点将数组的值赋给刚才创建的结点的数据域创建左子树,如果当前结点位置为i,则左孩子位置为2i创建右子树,如果当前结点位置为i,则右孩子位置为2i+1}否则R为空算法二:CopyTree(BiNode<T>*sR,BiNode<T>* &dR))【1】算法功能:复制构造函数【2】算法基本思想:按照先创建根结点,再递归创建左右子树的方法来实现。

【3】算法空间时间复杂度分析:O(n)【4】代码逻辑:如果源二叉树根结点不为空则{创建根结点调用函数自身,创建左子树调用函数自身,创建右子树}将该函数放在复制构造函数中调用,就可以实现复制构造函数算法三:PreOrder(BiNode<T>*R)【1】算法功能:二叉树的前序遍历【2】算法基本思想:这个代码用的是优化算法,提前让当前结点出栈。

【3】算法空间时间复杂度分析:O(n)【4】代码逻辑(伪代码)如果当前结点为非空,则{访问当前结点当前结点入栈将当前结点的左孩子作为当前结点}如果为空{则栈顶结点出栈则将该结点的右孩子作为当前结点}反复执行这两个过程,直到结点为空并且栈空算法四:InOrder(BiNode<T>*R)【1】算法功能:二叉树的中序遍历【2】算法基本思想:递归【3】算法空间时间复杂度分析:未知【4】代码逻辑:如果R为非空:则调用函数自身遍历左孩子访问该结点再调用自身访问该结点的右孩子算法五:LevelOrder(BiNode<T>*R)【1】算法功能:二叉树的层序遍历【2】算法基本思想:【3】算法空间时间复杂度分析:O(n)【4】代码逻辑(伪代码):如果队列不空{对头元素出队访问该元素若该结点的左孩子为非空,则左孩子入队;若该结点的右孩子为非空,则右孩子入队;}算法六:Count(BiNode<T>*R)【1】算法功能:计算结点的个数【2】算法基本思想:递归【3】算法空间时间复杂度分析:未知【4】代码逻辑:如果R不为空的话{调用函数自身计算左孩子的结点数调用函数自身计算右孩子的结点数}template<class T>int BiTree<T>::Count(BiNode<T>*R){if(R==NULL)return 0;else{int m=Count(R->lchild);int n=Count(R->rchild);return m+n+1;}}算法七:Release(BiNode<T>*R)【1】算法功能:释放动态内存【2】算法基本思想:左右子树全部释放完毕后再释放该结点【3】算法空间时间复杂度分析:未知【4】代码逻辑:调用函数自身,释放左子树调用函数自身,释放右子树释放根结点释放二叉树template<class T>void BiTree<T>::Release(BiNode<T>*R) {if(R!=NULL){Release(R->lchild);Release(R->rchild);delete R;}}template<class T>BiTree<T>::~BiTree(){Release(root);}int main(){BiTree<int> BTree(a,10);BiTree<int>Tree(BTree);BTree.PreOrder(BTree.root);cout<<endl;Tree.PreOrder(Tree.root);cout<<endl;BTree.InOrder(BTree.root);cout<<endl;Tree.InOrder(Tree.root);cout<<endl;BTree.PostOrder(BTree.root);cout<<endl;Tree.PostOrder(Tree.root);cout<<endl;BTree.LevelOrder(BTree.root);cout<<endl;Tree.LevelOrder(Tree.root);cout<<endl;int m=BTree.Count(BTree.root);cout<<m<<endl;return 0;}3.测试数据:int a[10]={1,2,3,4,5};1 2 4 5 31 2 4 5 34 25 1 34 5 2 3 11 2 3 4 554.总结:4.1:这次实验大多用了递归的算法,比较好理解。

二叉树操作 实验报告

二叉树操作 实验报告

实验报告
课程名称:《计算机软件基础》
实验类型:设计型(验证型、创新型、综合型、设计型)
实验项目名称:二叉树操作
学生姓名:专业:教育技术学学号:
指导老师:
实验地点:软件实验室实验学时: 2 学时
一、实验目的和要求
目的:掌握二叉树的定义、性质及存储方式,各种遍历算法。

要求:采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作
二、主要仪器设备或者软件
1.软件:操作系统和C语言系统。

2.硬件:一台微型计算机
三、操作方法与实验步骤
操作方法:
1、分析、理解程序。

2、调试程序,设计一棵二叉树,输入完全二叉树的先序序列,用#代表虚结
点(空指针),如ABD###CE##F##,建立二叉树,求出先序、中序和后序以及按层次遍历序列,求所有叶子及结点总数。

实验步骤:
1.基于先序遍历算法创建二叉树
2.要求输入先序序列,其中加入虚结点“#”以示空指针的位置
3.NLR先序遍历
4.LNR中序遍历
5.LRN后序遍历
1.采用后序遍历求二叉树的深度,结点数及叶子树的递归算法
2.利用“先进先出”(FIFO)队列,按层次遍历二叉树
四、 讨论或心得
通过对树和二叉树的各种操作,我知道了一般的树和二叉树的区别,认识了结点,知道了包括前序遍历、中序遍历和后序遍历是针对根结点而言的,这正是以前所迷茫的。

五、画出设计的二叉树
执行踪迹(后序遍历):
4 2
5 3 1
五、 实验结果
先序遍历:1 2 4 3 5
中序遍历:4 2 1 3 5
后序遍历:4 2 5 3 1。

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

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

二叉树的基本操作与实现实验报告二叉树是一种重要的数据结构,在计算机科学领域中被广泛应用。

本实验将介绍二叉树的基本操作与实现,并给出相应的实验报告。

一、引言二叉树是一种特殊的树状结构,每个节点至多有两个子节点。

二叉树有许多重要的特性,如平衡二叉树、二叉树等,应用广泛。

在本实验中,我们将介绍二叉树的基本操作和实现。

二、实验目的1.掌握二叉树的基本概念和特性;2.熟悉二叉树的基本操作,包括创建、插入、删除、遍历等;3.学会使用编程语言实现二叉树的基本操作。

三、实验内容本实验主要包括以下内容:1.二叉树的定义和基本概念;2.二叉树的基本操作,包括创建、插入、删除、遍历等;3.使用编程语言实现二叉树的基本操作;4.测试和验证二叉树的基本操作的正确性。

四、实验步骤1.二叉树的定义和基本概念二叉树是一种树状结构,每个节点至多有两个子节点。

二叉树的每个节点包含一个数据项和指向左子树和右子树的指针。

二叉树的特性有很多,如完全二叉树、平衡二叉树、二叉树等。

2.二叉树的基本操作(1)创建二叉树:可以通过手动输入节点数据来创建二叉树,也可以通过读取文件中的数据来创建二叉树。

(2)插入节点:在指定位置插入一个新节点。

(3)删除节点:删除指定位置的节点。

(4)遍历二叉树:有前序遍历、中序遍历和后序遍历三种遍历方式。

3.使用编程语言实现二叉树的基本操作实现二叉树的基本操作可以使用编程语言来完成。

我们可以定义一个二叉树的结构体,包含节点数据和指向左右子树的指针。

然后根据具体的需求,实现相应的操作函数。

4.测试和验证二叉树的基本操作的正确性在完成二叉树的基本操作后,我们可以编写测试代码来验证操作的正确性。

通过创建二叉树,并进行插入、删除和遍历操作,观察输出结果是否符合预期。

五、实验结果与分析在完成二叉树的基本操作后,我们可以进行测试和验证。

通过输出二叉树的遍历结果,比对预期结果来判断操作是否正确。

同时,我们还可以观察二叉树的结构和特性,如是否满足平衡二叉树或二叉树的条件。

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

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

二叉树的基本操作实验报告二叉树的基本操作实验报告引言:二叉树是一种常见的数据结构,它由节点组成,每个节点最多有两个子节点。

二叉树的基本操作包括创建、遍历、插入和删除等。

本实验旨在通过实践来深入了解二叉树的基本操作,并通过实验结果验证其正确性和有效性。

一、创建二叉树创建二叉树是二叉树操作中的第一步。

在本实验中,我们使用了递归算法来创建二叉树。

递归算法是一种重要的算法思想,通过将问题划分为更小的子问题来解决复杂的问题。

在创建二叉树时,我们首先创建根节点,然后递归地创建左子树和右子树。

二、遍历二叉树遍历二叉树是对二叉树中的每个节点进行访问的过程。

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

前序遍历先访问根节点,然后递归遍历左子树和右子树;中序遍历先递归遍历左子树,然后访问根节点,最后递归遍历右子树;后序遍历先递归遍历左子树和右子树,最后访问根节点。

三、插入节点插入节点是向二叉树中添加新节点的操作。

插入节点的过程需要遵循二叉树的特性,即左子节点的值小于父节点的值,右子节点的值大于父节点的值。

在插入节点时,我们需要找到合适的位置,将新节点插入到正确的位置上。

四、删除节点删除节点是从二叉树中移除节点的操作。

删除节点的过程相对复杂,需要考虑多种情况。

如果要删除的节点是叶子节点,直接删除即可。

如果要删除的节点只有一个子节点,将其子节点连接到父节点上。

如果要删除的节点有两个子节点,我们需要找到其后继节点或前驱节点来替代被删除的节点。

实验结果:通过实验,我们成功地实现了二叉树的基本操作。

创建二叉树的递归算法能够正确地创建出符合要求的二叉树。

遍历二叉树的算法能够按照指定的顺序遍历每个节点。

插入节点和删除节点的操作也能够正确地修改二叉树的结构。

讨论与总结:二叉树的基本操作是数据结构中的重要内容,对于理解和应用其他数据结构具有重要意义。

通过本次实验,我们深入了解了二叉树的创建、遍历、插入和删除等操作,并通过实验验证了其正确性和有效性。

数据结构实验报告(二叉树的基本操作)

数据结构实验报告(二叉树的基本操作)
else if((root->LChild==NULL)&&(root->RChild==NULL)) LeafNum=1;
else LeafNum=LeafCount(root->LChild)+LeafCount(root->RChild);
//叶子数为左右子树数目之和
return LeafNum;
printf("\n菜单选择\n\n");
printf(" 1.树状输出二叉树2.先序遍历二叉树\n");
printf(" 3.中序遍历二叉树4.后序遍历二叉树\n");
printf(" 5.输出叶子结点6.输出叶子结点的个数\n");
printf(" 7.输出二叉树的深度8.退出\n");
printf("\n----------------------------------------------------------------------\n");
{
printf("\n\n");
j=j+1; k=0;
while(k<nlocate)
{
printf(" ");
k++;
}
}
while(k<(nlocate-1))
{
printf(" ");
k++;
}
printf("%c",bt->data );
q.front=q.front+1;
if(bt->LChild !=NULL)//存在左子树,将左子树根节点入队列

二叉树实现及应用实验报告

二叉树实现及应用实验报告

二叉树实现及应用实验报告实验名称:二叉树实现及应用实验目的:1. 实现二叉树的创建、插入和删除操作。

2. 学习二叉树的遍历方法,并能够应用于实际问题。

3. 掌握二叉树在数据结构和算法中的一些常用应用。

实验内容:1. 实现二叉树的创建、插入和删除操作,包括二叉树的构造函数、插入函数和删除函数。

2. 学习二叉树的三种遍历方法:前序遍历、中序遍历和后序遍历,并应用于实际问题。

3. 掌握二叉树的一些常用应用,如二叉搜索树、平衡二叉树和哈夫曼树等。

实验步骤:1. 创建二叉树的结构体,包括树节点和树的根节点。

2. 实现二叉树的构造函数,用于创建二叉树的根节点。

3. 实现二叉树的插入函数,用于将元素插入到二叉树中的合适位置。

4. 实现二叉树的删除函数,用于删除二叉树中的指定元素。

5. 学习并实现二叉树的前序遍历、中序遍历和后序遍历函数。

6. 运用二叉树的遍历方法解决实际问题,如查找二叉树中的最大值和最小值。

7. 学习并应用二叉搜索树、平衡二叉树和哈夫曼树等常用二叉树结构。

实验结果:1. 成功创建、插入和删除二叉树中的元素,实现了二叉树的基本操作。

2. 正确实现了二叉树的前序遍历、中序遍历和后序遍历,并能够正确输出遍历结果。

3. 通过二叉树的遍历方法成功解决了实际问题,如查找二叉树中的最大值和最小值。

4. 学习并熟练应用了二叉搜索树、平衡二叉树和哈夫曼树等常用二叉树结构,丰富了对二叉树的理解。

实验分析:1. 二叉树是一种重要的数据结构,具有较好的数据存储和查找性能,广泛应用于计算机科学和算法领域。

2. 通过实验,我们深入了解了二叉树的创建、插入和删除操作,以及前序遍历、中序遍历和后序遍历的原理和应用。

3. 实际问题往往可以转化为二叉树的遍历问题进行求解,通过实验,我们成功应用了二叉树的遍历方法解决了实际问题。

4. 熟练掌握二叉搜索树、平衡二叉树和哈夫曼树的原理和应用,对于提高我们在数据结构和算法方面的设计能力具有重要意义。

c语言二叉树实验报告

c语言二叉树实验报告

c语言二叉树实验报告一、实验目的本次实验的目的是通过使用C语言编写程序,实现二叉树的基本操作,包括创建二叉树、插入节点、删除节点、遍历等功能。

通过这些操作,加深对数据结构和算法的理解,提高编程能力。

二、实验环境1. 操作系统:Windows 102. 开发工具:Code::Blocks 20.033. 编程语言:C语言三、实验过程及结果1. 创建二叉树在程序中定义了一个结构体来表示二叉树节点:```typedef struct Node {int data; // 节点数据struct Node *left; // 左子节点指针struct Node *right; // 右子节点指针} Node;```创建一个新节点的函数为:```Node *create_node(int data) {Node *node = (Node*)malloc(sizeof(Node)); node->data = data;node->left = NULL;node->right = NULL;return node;}```通过递归方式创建一棵二叉树:```Node *create_tree() {int data;scanf("%d", &data);if (data == -1) {return NULL;}Node *node = create_node(data);node->left = create_tree();node->right = create_tree();return node;}2. 插入节点插入节点需要先找到要插入位置的父节点,然后根据插入位置是左子节点还是右子节点,将新节点插入到相应的位置:```void insert_node(Node *root, int data) {Node *node = create_node(data);Node *parent = NULL;Node *current = root;while (current != NULL) {parent = current;if (data < current->data) {current = current->left;} else {current = current->right;}}if (data < parent->data) {parent->left = node;} else {parent->right = node;}```3. 删除节点删除节点需要先找到要删除的节点,然后根据其子节点的情况进行删除操作:```Node *delete_node(Node *root, int data) {if (root == NULL) {return root;}if (data < root->data) {root->left = delete_node(root->left, data);} else if (data > root->data) {root->right = delete_node(root->right, data);} else { // 找到要删除的节点if (root->left == NULL && root->right == NULL) { // 没有子节点free(root);return NULL;} else if (root->left == NULL || root->right == NULL) { // 只有一个子节点Node *temp;if (root->left != NULL) {temp = root->left;} else {temp = root->right;}free(root);return temp;} else { // 有两个子节点Node *temp = root->right;while (temp->left != NULL) {temp = temp->left;}root->data = temp->data;root->right = delete_node(root->right, temp->data); }}return root;}```4. 遍历二叉树遍历二叉树有三种方式:前序遍历、中序遍历和后序遍历。

二叉树的基本操作实验

二叉树的基本操作实验
六 运行结果
图(1)
图表1
else if(a==4)
{
printf("层序遍历:");
howmuch(T,2);
}
else if(a==5)
{
printf("总节点数:");
howmuch(T,0);
}
else if(a==6)
{
printf("总叶子数:");
howmuch(T,1);
}
else if(a==7)
{
printf("树的深度:");
二 概要设计
功能实现
1.int CreatBiTree(BiTree &T)用递归的方法先序建立二叉树, 并用链表储存该二叉树
2.int PreTravel(BiTree &T)前序遍历
3.intMidTravel(BiTree &T)中序遍历
4.intPostTravel(BiTree &T)后序遍历
实验三 二叉树的基本运算
一、实验目的
1、使学生熟练掌握二叉树的逻辑结构和存储结构。
2、熟练掌握二叉树的各种遍历算法。
二、实验内容
[问题描述]
建立一棵二叉树,试编程实现二叉树的如下基本操作:
1. 按先序序列构造一棵二叉链表表示的二叉树T;
2. 对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出结点的遍历序列;
5.int Depth(BiTree &T) //计算树的深度
6.inthowmuch(BiTree T,int h)采用树节点指针数组,用于存放遍历到的元素地址,如果有左孩子,存入地址,j加一 ,否则没操作,通过访问数组输出层次遍历的结果。k计算叶子数,j为总节点。

二叉树操作实验报告

二叉树操作实验报告

实验报告实验名称:对二叉树的操作。

实验内容:1、按中序遍历结果从小到大的顺序建立一棵含有n个结点的二叉树,采用二叉链表存储;2、中序、前序、后序改二叉链表;3、输入一个数据,访问任一结点进行查找,如果有则返回“查找成功。

”,没有则返回“查找不成功。

”4、设计一个析构函数,释放结点空间。

实验代码:#include<iostream.h>class node{private:int data;class node *left;class node *right;void Release(class node *a);public:void create(int a);void inorder(class node *q);void preorder(class node *m);void postorder(class node *n);void seek(class node *l,int k);~node();};typedef class node treenode;//重定义二叉树结点类型。

typedef treenode *zz;//重新定义指针。

zz root,p;void node::create(int x){zz s;int flag=0;//结点成功插入后flag=1。

s=new treenode;s->data=x;s->left=NULL;s->right=NULL;if(root==NULL)root=s;else{p=root;while(!flag)if(x<p->data)if(p->left==NULL){p->left=s;flag=1;}elsep=p->left;elseif(p->right==NULL){ p->right=s;flag=1; }elsep=p->right;}}void node::inorder(zz q){if(q!=NULL){inorder(q->left);cout<<q->data<<" ";inorder(q->right);}}void node::preorder(zz m){if (m==NULL)return;else{cout<<m->data<<" ";preorder(m->left);preorder(m->right);}}void node::postorder(zz n){if (n==NULL)return;else{postorder(n->left);postorder(n->right);cout<<n->data<<" ";}}void node::seek(class node *l,int k){if(l==NULL)cout<<"查找失败,不存在该数据。

  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");}}}。

相关文档
最新文档