二叉树实验报告及代码
二叉树的建立与遍历实验报告(c语言编写,附源代码)

二叉树的建立与遍历实验报告(c语言编写,附源代码)二叉树的建立与遍历实验报告级班年月日姓名学号_1.实验题目建立一棵二叉树,并对其进行遍历(先序、中序、后序),打印输出遍历结果。
2.需求分析本程序用VC编写,实现建立一棵二叉树的功能,并对其进行遍历(先序、中序、后序),并且打印输出遍历结果。
①输入的形式和输入值的范围:输入二叉树的先序,当其结点为空时,需要输入#。
(输入的先序仅含字母和#)②输出的形式:输出二叉树的先序、中序、后序。
③程序所能达到的功能:实现建立一棵二叉树的功能,并对其进行遍历(先序、中序、后序),并且打印输出遍历结果。
④测试数据:输入数据:输入ABC##DE#G##F###输出结果:二叉树的先序遍历为:ABCDEGF二叉树的中序遍历为:CBEGDFA二叉树的后序遍历为:CGEFDBA3.概要设计1)为了实现上述程序功能,需要定义二叉链表的抽象数据类型:typedef struct BinaryTreeNode{TElemType data;//二叉树结点中的数据域struct BinaryTreeNode *lchild , *rchild; //二叉树结点的左孩子和右孩子指针}BinaryTreeNode ,*BiTree;基本操作:A.void CreateBinaryTree (BiTree &T)初始条件:无操作结果:建立了二叉树。
B. void PreOrder(BiTree T)初始条件:存在一棵二叉树操作结果:先序遍历二叉树,并且输出先序遍历的结果。
C. void MidOrder(BiTree T)初始条件:存在一棵二叉树操作结果:中序遍历二叉树,并且输出中序遍历的结果。
D. void PostOrder(BiTree T)初始条件:存在一棵二叉树操作结果:后序遍历二叉树,并且输出后序遍历的结果。
程序包含5个函数:○1主函数main()○2先序建立二叉树 void CreateBinaryTree (BiTree &T)○3先序遍历二叉树,并且输出先序遍历的结果void PreOrder(BiTree T);○4中序遍历二叉树,并且输出中序遍历的结果void MidOrder(BiTree T);○5序遍历二叉树,并且输出后序遍历的结果void PostOrder(BiTree T); 各函数间关系如下:主函数main()CreateBinaryTree PreOrder MidOrder PostOrder4.详细设计1)二叉链表的定义typedef struct BinaryTreeNode{定义一个树结点的数据域;定义一个该结点的左孩子指针和右孩子指针;}2)void CreateBinaryTree (BiTree &T)//先序建立二叉树{输入一个字符量;if(输入字符== '#') T指针置值为NULL;else{动态申请一个指向二叉树结构体的指针把输入字符赋值给新指针的数据域data;调用CreateBinaryTree(新指针的lchild成员);调用CreateBinaryTree(新指针的rchild成员);}}3)void PreOrder(BiTree T) //先序遍历二叉树{if(T指针不为NULL){输出T的data域;先序遍历左子树;先序遍历右子树;}}4)void MidOrder(BiTree T) //中序遍历二叉树{if(T指针不为NULL){中序遍历左子树;输出T的data域;中序遍历右子树;}}5)void PostOrder(BiTree T) //中序遍历二叉树{if(T指针不为NULL){后序遍历左子树;后序遍历右子树;输出T的data域;}}5.调试分析在编写程序过程中,我将scanf(”%c”,&ch)中的%c写成%d,程序运行了一段时间没有结果,经过检查,发现了这个错误。
(完整版)C++二叉树基本操作实验报告

一、实验目的选择二叉链式存储结构作为二叉树的存储结构,设计一个程序实现二叉树的基本操作(包括建立、输出、前序遍历、中序遍历、后序遍历、求树高、统计叶子总数等)二、实验开发环境Windows 8.1 中文版Microsoft Visual Studio 6.0三、实验内容程序的菜单功能项如下:1------建立一棵二叉树2------前序遍历递归算法3------前序遍历非递归算法4------中序遍历递归算法5------中序遍历非递归算法6------后序遍历递归算法7------后序遍历非递归算法8------求树高9------求叶子总数10-----输出二叉树11-----退出四、实验分析1、建立一棵二叉树2、输入二叉树各节点数据cout<<"请按正确顺序输入二叉树的数据:";cin.getline(t,1000); //先把输入的数据输入到一个t数组3、递归前序遍历void BL1(ECS_data *t){if(NULL!=t){cout<<t->data<<",";BL1(t->l);BL1(t->r);}}4、非递归前序遍历void preOrder2(ECS_data *t){stack<ECS_data*> s;ECS_data *p=t;while(p!=NULL||!s.empty()){while(p!=NULL){cout<<p->data<<" ";s.push(p);p=p->l;}if(!s.empty()){p=s.top();s.pop();p=p->r;}}}5、递归中序遍历void BL2(ECS_data *t){if(NULL!=t){BL2(t->l);cout<<t->data<<",";BL2(t->r);}}6、非递归中序遍历void inOrder2(ECS_data *t) //非递归中序遍历{stack<ECS_data*> s;ECS_data *p=t;while(p!=NULL||!s.empty()){while(p!=NULL){s.push(p);p=p->l;}if(!s.empty()){p=s.top();cout<<p->data<<" ";s.pop();p=p->r;}}}7、递归后序遍历void BL3(ECS_data *t){if(NULL!=t){BL3(t->l);BL3(t->r);cout<<t->data<<",";}}8、非递归后序遍历void postOrder3(ECS_data *t){stack<ECS_data*> s;ECS_data *cur; //当前结点ECS_data *pre=NULL; //前一次访问的结点s.push(t);while(!s.empty()){cur=s.top();if((cur->l==NULL&&cur->r==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)s.push(cur->l);}}}9、求树高int Height (ECS_data *t){if(t==NULL) return 0;else{int m = Height ( t->l );int n = Height(t->r);return (m > n) ? (m+1) : (n+1);}}10、求叶子总数int CountLeaf(ECS_data *t){static int LeafNum=0;//叶子初始数目为0,使用静态变量if(t)//树非空{if(t->l==NULL&&t->r==NULL)//为叶子结点LeafNum++;//叶子数目加1else//不为叶子结点{CountLeaf(t->l);//递归统计左子树叶子数目CountLeaf(t->r);//递归统计右子树叶子数目}}return LeafNum;}五、运行结果附:完整程序源代码://二叉树链式存储的实现#include<iostream>#include<cstring>#include <stack>using namespace std;struct ECS_data //先定义好一个数据的结构{char data;ECS_data *l;ECS_data *r;};class ECS{private://int level; //树高int n; //表示有多少个节点数int n1; //表示的是数组的总长度值,(包括#),因为后面要进行删除判断ECS_data *temp[1000];public:ECS_data *root;ECS() //初始化{ECS_data *p;char t[1000];int i;int front=0,rear=1; //front表示有多少个节点,rear表示当前插入的点的父母cout<<"请按正确顺序输入二叉树的数据:";cin.getline(t,1000); //先把输入的数据输入到一个t数组//cout<<t<<" "<<endl;int n1=strlen(t); //测量数据的长度n=0;for(i=0;i<n1;i++){if(t[i]!='#'){p=NULL;if(t[i]!=',') //满足条件并开辟内存{n++;p=new ECS_data;p->data=t[i];p->l=NULL;p->r=NULL;}front++;temp[front]=p;if(1 == front){root=p;}else{if((p!=NULL)&&(0==front%2)){temp[rear]->l=p;//刚开始把这里写成了==}if((p!=NULL)&&(1==front%2)){temp[rear]->r=p;}if(1==front%2)rear++; //就当前的数据找这个数据的父母}}}}~ECS() //释放内存{int i;for(i=1;i<=n;i++)if(temp[i]!=NULL)delete temp[i];}void JS() //记录节点的个数{int s;s=n;cout<<"该二叉树的节点数为:"<<s<<endl;}void BL1(ECS_data *t)//递归前序遍历{if(NULL!=t){cout<<t->data<<",";BL1(t->l);BL1(t->r);}}void preOrder2(ECS_data *t) //非递归前序遍历{stack<ECS_data*> s;ECS_data *p=t;while(p!=NULL||!s.empty()){while(p!=NULL){cout<<p->data<<" ";s.push(p);p=p->l;}if(!s.empty()){p=s.top();s.pop();p=p->r;}}}void BL2(ECS_data *t)//递归中序遍历{if(NULL!=t){BL2(t->l);cout<<t->data<<",";BL2(t->r);}}void inOrder2(ECS_data *t) //非递归中序遍历{stack<ECS_data*> s;ECS_data *p=t;while(p!=NULL||!s.empty()){while(p!=NULL){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; //前一次访问的结点s.push(t);while(!s.empty()){cur=s.top();if((cur->l==NULL&&cur->r==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)s.push(cur->l);}}}int Height (ECS_data *t) //求树高{if(t==NULL) return 0;else{int m = Height ( t->l );int n = Height(t->r);return (m > n) ? (m+1) : (n+1);}}int CountLeaf(ECS_data *t) //求叶子总数{static int LeafNum=0;//叶子初始数目为0,使用静态变量if(t)//树非空{if(t->l==NULL&&t->r==NULL)//为叶子结点LeafNum++;//叶子数目加1else//不为叶子结点{CountLeaf(t->l);//递归统计左子树叶子数目CountLeaf(t->r);//递归统计右子树叶子数目}}return LeafNum;}};int main(){ECS a;a.JS();cout<<"递归前序遍历:";a.BL1(a.root);cout<<endl;cout<<"非递归前序遍历:";a.preOrder2(a.root);cout<<endl;cout<<"递归中序遍历:";a.BL2(a.root);cout<<endl;cout<<"非递归中序遍历:";a.inOrder2(a.root);cout<<endl;cout<<"递归后序遍历:";a.BL3(a.root);cout<<endl;cout<<"非递归后序遍历:";a.postOrder3(a.root);cout<<endl;cout<<"树高为:"<<a.Height(a.root)<<endl;cout<<"叶子总数为:"<<a.CountLeaf(a.root)<<endl;return 0;}。
二叉树的基本操作实验报告

二叉树的基本操作实验报告学号姓名实验日期 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是对结点操作的应用函数。
二叉树应用源代码和实验报告

实验十一二叉树的应用姓名:高翠莹学号:09 专业班级:数媒151一、实验项目名称二叉树的应用二、实验目的1.通过实验理解二叉树的逻辑结构;2.通过实验掌握二叉树的二叉链表存储结构;3.通过实验掌握二叉树的应用。
三、实验基本原理1、数据结构typedef struct BiTNode{char data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;2、算法思想这次实验主要是对二叉树的一些应用:(1)在二叉树中查找值为value的结点:即寻找每一个节点的data,若与value相同则返回;(2)统计出二叉树中叶子结点的数目:如果一个左孩子和右孩子都为空,则返回1,然后递归访问左子树和右子树,统计出所有的叶子结点;(3)统计出二叉树中非叶子结点的数目:用所有结点个数减去叶子结点个数即可;(4)统计出二叉树中所有结点的数目:递归调用,返回左子树结点个数加右结点个数,再加1;(5)求二叉树的高度递归求左子树高度h1和右子树高度h2,如果h1>h2,则返回h1+1,否则返回h2+1;3、算法描述见代码四、主要仪器设备及耗材1、硬件环境2、开发平台Dev C++五、实验步骤1.分析题目,确定数据结构类型,设计正确的算法;2.编写代码;3.运行及调试程序;4.修改程序,提高其健壮性。
六、实验数据及处理结果1、程序清单#include<iostream>#include<cstdlib>using namespace std;typedef struct BiTNode{char data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;算二叉树中所有结点的数目"<<endl;cout<<"2.计算二叉树中所有叶子结点的数目"<<endl;cout<<"3.计算二叉树中所有非叶子结点的数目"<<endl;cout<<"4.查找二叉树中值为value的结点"<<endl;cout<<"5.求二叉树中的高度"<<endl;cout<<"0.退出"<<endl;}int main(){cout<<"***************二叉树的应用*************"<<endl;cout<<"一、创建二叉树"<<endl;BiTree T;cout<<"按先序次序输入二叉树中结点的值(一个字符),‘#’表示空树"<<endl;CreateBiTree(T);cout<<"先序遍历这课树: "<<endl;PreOrder(T);cout<<endl;cout<<"二、具体操作"<<endl;Tips();int op;char x;cin>>op;while(op){switch(op){case 1:cout<<"树的所有节点个数为: ";cout<<countBTreeNode(T);break;case 2:cout<<"所有叶子结点个数为: ";cout<<Calleaf(T);break;case 3:int count;cout<<"非叶子结点的个数为: "<<countBTreeNode(T)-Calleaf(T)<<endl;break;case 4:cout<<"请输入value的值:";cin>>x;cout<<"值为"<<x<<"的结点为: ";locate(T,x);break;case 5:cout<<"树的高度为: ";cout<<BTreeHigh(T);break;}Tips(); cin>>op;}}2、运行结果(1)创建(2)操作求所有结点个数:求所有叶子结点个数:求所有非叶子结点个数:求值为value的结点:求二叉树的高度:七、思考讨论题或体会或对改进实验的建议这次实验之后,我更加了解树的逻辑结构,它有很强的递归属性,所以只要理解了递归的本质,就不难理解本次实验的操作,因为在操作时基本上都用到了递归方法,可以用少量的代码就能实现功能。
二叉树操作设计和实现实验报告

二叉树操作设计和实现实验报告一、目的:掌握二叉树的定义、性质及存储方式,各种遍历算法。
二、要求:采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作。
三、实验内容: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,即为叶子。
数据结构二叉树的实验报告

数据结构实验报告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:这次实验大多用了递归的算法,比较好理解。
数据结构二叉树实验报告

数据结构二叉树实验报告1. 引言二叉树是一种常见的数据结构,由节点(Node)和链接(Link)构成。
每个节点最多有两个子节点,分别称为左子节点和右子节点。
二叉树在计算机科学中被广泛应用,例如在搜索算法中,二叉树可以用来快速查找和插入数据。
本实验旨在通过编写二叉树的基本操作来深入理解二叉树的特性和实现方式。
2. 实验内容2.1 二叉树的定义二叉树可以用以下方式定义:class TreeNode:def__init__(self, val):self.val = valself.left =Noneself.right =None每个节点包含一个值和两个指针,分别指向左子节点和右子节点。
根据需求,可以为节点添加其他属性。
2.2 二叉树的基本操作本实验主要涉及以下二叉树的基本操作:•创建二叉树:根据给定的节点值构建二叉树。
•遍历二叉树:将二叉树的节点按照特定顺序访问。
•查找节点:在二叉树中查找特定值的节点。
•插入节点:向二叉树中插入新节点。
•删除节点:从二叉树中删除特定值的节点。
以上操作将在下面章节详细讨论。
3. 实验步骤3.1 创建二叉树二叉树可以通过递归的方式构建。
以创建一个简单的二叉树为例:def create_binary_tree():root = TreeNode(1)root.left = TreeNode(2)root.right = TreeNode(3)root.left.left = TreeNode(4)root.left.right = TreeNode(5)return root以上代码创建了一个二叉树,根节点的值为1,左子节点值为2,右子节点值为3,左子节点的左子节点值为4,左子节点的右子节点值为5。
3.2 遍历二叉树二叉树的遍历方式有多种,包括前序遍历、中序遍历和后序遍历。
以下是三种遍历方式的代码实现:•前序遍历:def preorder_traversal(root):if root:print(root.val)preorder_traversal(root.left)preorder_traversal(root.right)•中序遍历:def inorder_traversal(root):if root:inorder_traversal(root.left)print(root.val)inorder_traversal(root.right)•后序遍历:def postorder_traversal(root):if root:postorder_traversal(root.left)postorder_traversal(root.right)print(root.val)3.3 查找节点在二叉树中查找特定值的节点可以使用递归的方式实现。
数据结构二叉树程序及实验报告参考模板

实验三树1.实验目的通过本实验,使学生加深对二叉树的基本概念的理解;掌握掌握二叉排序树的插入和生成;掌握二叉树遍历操作及应用。
2.实验内容创建一个二叉树,并进行先序遍历、中序遍历、后序遍历、层次遍历,打印二叉树的叶子结构,并统计叶子结点个数和总结点个数。
3.实验要求(1)设计一个程序实现上述过程。
(2)采用二叉链表存储结构。
4、实验步骤#include "stdio.h"#include "malloc.h"#define ELEMTYPE chartypedef struct BiTNode { ELEMTYPE data;struct BiTNode*lchild,*rchild; } BiTNode;BiTNode *bulid() /*建树*/{ BiTNode *q;BiTNode *s[20];int i,j; char x;printf("请按顺序输入二叉树的结点以输入0和*号结束\n");printf("请输入你要输入的为第几个结点i=\n");scanf("%d",&i); printf("请输入你要输入该结点的数为x=");getchar();scanf("%c",&x);while(i!=0&&x!='*'){q=(BiTNode*)malloc(sizeof(BiTNode));q->data=x; q->rchild=NULL;q->lchild=NULL; s[i]=q; if(i!=1){ j=i/2; if(i%2==0) s[j]->lchild=q; else s[j]->rchild=q; }printf("请输入你要输入的为第几个结点x=\n");scanf("%d",&i); printf("请输入你要输入该结点的数x=");getchar(); scanf("%c",&x);}return s[1]; }void preoder(BiTNode *bt) /*先序遍历*/{ if(bt!=NULL){ printf("%c\n",(bt->data)); preoder(bt->lchild); preoder(bt->rchild); }}void InOrder(BiTNode *bt) /*中序遍历*/{ if(bt!=NULL) { InOrder(bt->lchild); printf("%c\n",bt->data); InOrder(bt->rchild); }}void postOrder(BiTNode *bt) /*后序遍历*/{ if(bt!=NULL) { postOrder(bt->lchild); postOrder(bt->rchild); printf("%c\n",bt->data); }}Int main(){int a;BiTNode *bt; bt=bulid();k1:printf("需要先序遍历输出请输入1,中序遍历请输入2,后序遍历请输入3,结束输入0:"); scanf("%d",&a);switch(a){ case(1): preoder(bt); goto k1; case(2): InOrder(bt); goto k1; case(3): postOrder(bt); goto k1; case(0): break; }5、实验结果友情提示:范文可能无法思考和涵盖全面,供参考!最好找专业人士起草或审核后使用,感谢您的下载!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
重庆交通大学综合性设计性实验报告姓名姚远学号 631106060113 班级:计信息一班实验项目名称:二叉树实验项目性质:设计性实验实验所属课程:数据结构实验室(中心): 407机房指导教师:鲁云平实验完成时间: 2013 年 5 月 10 日一、实验目的1. 建立二叉树2. 计算结点所在的层次3.统计结点数量和叶结点数量4.计算二叉树的高度5.计算结点的度6.找结点的双亲和子女7.二叉树的遍历8.二叉树的输出等等二、实验内容及要求1.二叉树的结点结构,二叉树的存储结构由学生自由选择和设定2.实验完成后上交打印的实验报告,报告内容与前面所给定的实验模板相同3.将实验报告电子版和源代码在网络教学平台提交三、实验设备及软件VISUAL C++软件四、设计方案㈠题目(老师给定或学生自定)二叉树的应用㈡设计的主要思路在计算机科学中,二叉树是每个结点最多有两个子树的有序树。
通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。
二叉树常被用作二叉查找树和二叉堆或是二叉排序树。
二叉树的每个结点至多只有二棵子树(不存在出度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。
二叉树的第i层至多有2的i -1次方个结点;深度为k的二叉树至多有2^(k) -1个结点;对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,出度为2的结点数为n2,则n0 =n2 + 1。
㈢主要功能实现二叉树的各项操作。
五、主要代码#include<iostream.h>#include<stdio.h>#include<stdlib.h>typedef struct BinTreeNode //二叉树结点类定义{char data;//数据域BinTreeNode *leftChild, *rightChild; //左子女、右子女链域}*BTree;BinTreeNode *p,*q,*f;int NodeNum,Leaf;int NodeDu,nodeloc=1;void CreateBinTree(BTree &T);void preOrder(BTree T);void inOrder(BTree T);void postOrder(BTree T);int TreeNodes(BTree T);int LeafNodes(BTree T);int TreeNodedu(BTree T,char ch);void NodeLoc(BTree T,char c,int nodeloc);int Height(BTree T);BTree Parent(BTree T,char c);BTree NodeRC(BTree T,char c);BTree NodeLC(BTree T,char c);void CreateBinTree(BTree &T){char item;cin>>item;if ( item!='#' ){T=(BTree )malloc(sizeof(BinTreeNode));T->data=item;if (T == NULL){cerr << "存储分配错误!" << endl;exit (1);}CreateBinTree (T->leftChild);//递归建立左子树CreateBinTree (T->rightChild); //递归建立右子树}elseT= NULL;};void inOrder(BTree T){if (T != NULL){inOrder (T->leftChild); //遍历左子树cout<<T->data<<" ";inOrder (T->rightChild); //遍历右子树}};void preOrder(BTree T){if (T != NULL){cout<<T->data<<" ";preOrder (T->leftChild); //遍历左子树preOrder (T->rightChild); //遍历右子树}};void postOrder(BTree T){if (T != NULL ){postOrder(T->leftChild);//遍历左子树postOrder(T->rightChild);//遍历右子树cout<<T->data<<" ";}};int TreeNodes(BTree T) //利用二叉树后序遍历算法计算二叉树的结点个数{int hl,hr;if(T != NULL){hl=TreeNodes(T->leftChild);hr=TreeNodes(T->rightChild);NodeNum=NodeNum+1;return NodeNum;}};int LeafNodes(BTree T) //利用二叉树后序遍历算法计算二叉树的叶结点个数{if(T != NULL){LeafNodes(T->leftChild);LeafNodes(T->rightChild);if(T->leftChild==NULL&&T->rightChild==NULL)Leaf=Leaf+1;}return Leaf;};int TreeNodedu(BTree T,char ch){if(T==NULL)return NULL;else{if(T->data == ch&&T->leftChild!=NULL&&T->rightChild==NULL) NodeDu=1;else if(T->data == ch&&T->rightChild!=NULL&&T->leftChild==NULL)NodeDu=1;else if(T->data == ch&&T->leftChild!=NULL&&T->rightChild!=NULL)NodeDu=2;else if(T->data == ch&&T->leftChild==NULL&&T->rightChild==NULL)NodeDu=0;TreeNodedu(T->leftChild,ch);TreeNodedu(T->rightChild,ch);return NodeDu;}}void NodeLoc(BTree T,char c,int nodeloc){if(T != NULL){if(T->data == c)cout<<nodeloc<<endl;NodeLoc(T->leftChild,c,nodeloc+1);NodeLoc(T->rightChild,c,nodeloc+1);}};int Height(BTree T) //利用二叉树后序遍历算法计算二叉树的高度{int hl,hr,hm;if(T == NULL)return 0;//空树高度为0else{hl = Height (T->leftChild);hr = Height (T->rightChild);hm=hl>hr?hl:hr;return (hm+1);}BTree Parent(BTree T,char c){BTree p;if (T==NULL) return NULL;if((T->leftChild!=NULL&&T->leftChild->data==c)||(T->rightChild!=NULL&&T->righ tChild->data==c))return T;//找到, 返回父结点地址else{if ((p=Parent(T->leftChild, c))!=NULL)return p; //递归在左子树中搜索elsereturn Parent(T->rightChild, c); //递归在左子树中搜索}return NULL;};BTree NodeLC(BTree T,char c){if(T==NULL)return NULL;else if(T->data == c){if (T->leftChild){return T->leftChild ;}}else{if(NodeLC(T->leftChild,c)!=NULL)return NodeLC(T->leftChild,c);else if(NodeLC(T->rightChild,c)!=NULL) return NodeLC(T->rightChild,c);elsereturn NULL;}}BTree NodeRC(BTree T,char c){if(T==NULL)return NULL;else if(T->data == c){if (T->rightChild){return T->rightChild ;}}else{if(NodeRC(T->leftChild,c)!=NULL)return NodeRC(T->leftChild,c);else if(NodeRC(T->rightChild,c)!=NULL) return NodeRC(T->rightChild,c);elsereturn NULL;}}void main(){BTree T;int nodes,leafnodes,height,nodedu;cout<<"创建二叉树,请输入完全二叉树的先序序列,用'#'代表虚结点:"<<endl;CreateBinTree(T);int i;do{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<<"****************9:输出二叉树任意结点的双亲结点值**********"<<endl;cout<<"****************10:输出二叉树任意结点的子女结点值*********"<<endl;cout<<"****************11:退出程序*******************************"<<endl;cout<<"请输入要执行的功能代码的编号(1-10):"<<endl;cin>>i;cout<<endl;switch(i){case 1:cout<<"前序遍历结果为:"<<endl;preOrder(T);break;case 2:cout<<"中序遍历结果为:"<<endl;inOrder(T);break;case 3:cout<<"后序遍历结果为:"<<endl;postOrder(T);break;case 4:height=Height(T);cout<<"二叉树的高度为:"<<height<<endl;break;case 5:nodes=TreeNodes(T);cout<<"二叉树的结点数为:"<<nodes<<endl;break;case 6:leafnodes=LeafNodes(T);cout<<"二叉树的叶结点数为:"<<leafnodes<<endl;break;case 7:char ch1;cout<<"请输入该结点的值:";cin>>ch1;nodedu=TreeNodedu(T,ch1);cout<<"该结点的度数为:"<<nodedu<<endl;break;case 8:char ch4;cout<<"请输入该结点的值:";cin>>ch4;cout<<"该结点所在二叉树的层次为:";NodeLoc(T,ch4,1);break;case 9:char ch2;cout<<"请输入该结点的值:";cin>>ch2;f=Parent(T,ch2);if(f!=NULL)cout<<"该结点双亲结点值为:"<<f->data<<endl;elsecout<<"该结点没有父结点。