1、C+二叉树基本操作实验报告一、实验目的 选择二叉链式存储结构作为二叉树的存储结构,设计一个程序实现二叉树的基本操作(包括建立、输出、前序遍历、中序遍历、后序遍历、求树高、统计叶子总数等)二、实验开发环境 Windows 8.1 中文版 Microsoft Visual Studio 6.0三、实验内容程序的菜单功能项如下:1-建立一棵二叉树2-前序遍历递归算法3-前序遍历非递归算法4-中序遍历递归算法5-中序遍历非递归算法6-后序遍历递归算法7-后序遍历非递归算法8-求树高9-求叶子总数10-输出二叉树11-退出四、实验分析1、建立一棵二叉树2、输入二叉树各节点数据 cout请按正确顺序输入二
2、叉树的数据:; cin.getline(t,1000); /先把输入的数据输入到一个t数组 3、递归前序遍历 void BL1(ECS_data *t) if(NULL!=t) coutdatal); BL1(t-r); 4、非递归前序遍历 void preOrder2(ECS_data *t) stack s; ECS_data *p=t; while(p!=NULL|!s.empty() while(p!=NULL) coutdatal; if(!s.empty() p=s.top(); s.pop(); p=p-r; 5、递归中序遍历 void BL2(ECS_data *t) if(N
3、ULL!=t) BL2(t-l); coutdatar); 6、非递归中序遍历 void inOrder2(ECS_data *t) /非递归中序遍历 stack 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(); coutdatar; 7、递归后序遍历 void BL3(ECS_data *t) if(NULL!=t) BL3(t-l); BL3(t-r); coutdata,; 8、非递归后序遍历 void postOrder3(ECS_da
4、ta *t) stack 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) coutdatar!=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 = Heig
5、ht ( 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+;/叶子数目加1 else/不为叶子结点 CountLeaf(t-l);/递归统计左子树叶子数目 CountLeaf(t-r);/递归统计右子树叶子数目 return LeafNum; 五、运行结果附:完整程序源代码:/二叉树链式存储
6、的实现 #include #include #include 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 *temp1000; public: ECS_data *root; ECS() /初始化 ECS_data *p; char t1000;int i; in
7、t front=0,rear=1; /front表示有多少个节点,rear表示当前插入的点的父母 cout请按正确顺序输入二叉树的数据:; cin.getline(t,1000); /先把输入的数据输入到一个t数组 /coutt endl; int n1=strlen(t); /测量数据的长度 n=0; for(i=0;idata=ti; p-l=NULL; p-r=NULL; front+; tempfront=p; if(1 = front)root=p; else if(p!=NULL)&(0=front%2) temprear-l=p;/刚开始把这里写成了= if(p!=NULL)&(
8、1=front%2) temprear-r=p; if(1=front%2)rear+; /就当前的数据找这个数据的父母 ECS() /释放内存 int i; for(i=1;i=n;i+) if(tempi!=NULL) delete tempi; void JS() /记录节点的个数 int s; s=n; cout该二叉树的节点数为:sendl; void BL1(ECS_data *t)/递归前序遍历 if(NULL!=t) coutdatal); BL1(t-r); void preOrder2(ECS_data *t) /非递归前序遍历 stack s; ECS_data *p=t
9、; while(p!=NULL|!s.empty() while(p!=NULL) coutdatal; if(!s.empty() p=s.top(); s.pop(); p=p-r; void BL2(ECS_data *t)/递归中序遍历 if(NULL!=t) BL2(t-l); coutdatar); void inOrder2(ECS_data *t) /非递归中序遍历 stack 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();
10、coutdatar; void BL3(ECS_data *t)/递归后序遍历 if(NULL!=t) BL3(t-l); BL3(t-r); coutdata,; void postOrder3(ECS_data *t) /非递归后序遍历 stack 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) coutdatar!=NULL) s
11、.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+;/叶子数目
12、加1 else/不为叶子结点 CountLeaf(t-l);/递归统计左子树叶子数目 CountLeaf(t-r);/递归统计右子树叶子数目 return LeafNum; ; int main() ECS a; a.JS(); cout递归前序遍历:; a.BL1(a.root); coutendl; cout非递归前序遍历:; a.preOrder2(a.root); coutendl; cout递归中序遍历:; a.BL2(a.root); coutendl; cout非递归中序遍历:; a.inOrder2(a.root); coutendl; cout递归后序遍历:; a.BL3(a.root); coutendl; cout非递归后序遍历:; a.postOrder3(a.root); coutendl; cout树高为:a.Height(a.root)endl; cout叶子总数为:a.CountLeaf(a.root)endl; return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1