1、rchild = Creat();/递归建立右子树 return root; 构造这样的函数,可以在输入时,按先序遍历顺序每次输入一个节点的数据,可以实现任意二叉树的构造。为了检验构造的二叉树是否为预先设想的二叉树,需要遍历二叉树并进行输出。考虑到单一的输出并不能确定唯一的二叉树,因此对遍历二叉树的四种常用发方法,即先序遍历,中序遍历,后续遍历,层次遍历分别实现,通过遍历结果检验构造的二叉树是否为预先设计好的二叉树。先序遍历:采用递归的方法建立。 template voidBiTree:xianxu(BiNode *root) if(root=NULL) return;/如果节点为空,则返回空
2、 else coutdataxianxu(root-lchild);/先序遍历树的左子树 xianxu(root-rchild);/先序遍历树的右子树 中序遍历:递归方法建立:zhongxu (BiNode *root) if (root=NULL) return;/如果节点为空,则返回空 else zhongxu (root-/中序递归遍历root的左子树 coutdata/访问根结点 zhongxu (root-/中序递归遍历root的右子树 后序遍历:houxu(BiNode *root) if (root=NULL) return;/如果节点为空,返回空 else houxu(root
3、-/后序递归遍历root的左子树 houxu(root-/后序递归遍历root的右子树 coutdata/访问根节点 层序遍历:采用非递归方法。利用队列的方法层序遍历二叉树。建立一个队列,在访问一个节点的时候,把它的左孩子和右孩子入队,并且将这个节点出队。当队列为空时,就完成了对二叉树的层序遍历。template voidBiTree:cengxu(BiNode *root) constintMaxSize = 100; int front = 0; int rear = 0; /利用队列的方法对树进行层序遍历 BiNode* QMaxSize; BiNode* q; if (root=NUL
4、L) return;/ 如果节点为空,返回空 else Qrear+ = root;/ 若节点不为空,则该节点入队 while (front != rear) q = Qfront+; /只要队列不为空,则节点依次出队 coutdataif (q-lchild != NULL) Qrear+ = q-lchild;rchild !rchild;/ 同时,该节点的双子入队 函数主体部分:声明一个类中的对象,调用构造函数,建立二叉树,并输出四种遍历结果,检验输出结果。int main() BiTreeshu; /声明类中一个对象,在构造了一颗树 BiNode* root = shu.Getroot
5、( ); /获取指向根结点的指针 cout程序结构:主函数建立一个类模板定义构造函数,析构函数,以及成员函数声明类中的一个对象调用构造函数,构造一颗二叉树层序遍历二叉树后序遍历二叉树中序遍历二叉树前序遍历二叉树获取该二叉树的根节点将结果输出,人工检验 源代码:#include using namespace std;template struct BiNode T data;BiNode *lchild, *rchild; ;template class BiTree public: BiTree( );/构造函数,初始化一棵二叉树 BiTree(void);/析构函数,释放二叉链表中各结点的
6、存储空间BiNode* Getroot();/获得指向根结点的指针void xianxu(BiNode *root);/前序遍历二叉树void zhongxu(BiNode *root);/中序遍历二叉树void houxu(BiNode *root);/后序遍历二叉树void cengxu(BiNode *root);/层序遍历二叉树 private:BiNode *root;BiNode *Creat( );void Release(BiNode *root); template BiTree:if (aa=else /生成一个结点return root; BiTree(void) Rel
7、ease(root);/析构函数,释放存储指针所需要的空间 Getroot( )/获取根节点所在指针的位置 return root;template void BiTree:/如果节点为空,则返回空coutdata/先序遍历树的左子树 /中序递归遍历root的左子树/如果节点为空,返回空houxu(root-/后序递归遍历root的左子树/后序递归遍历root的右子树cengxu(BiNode *root) const int MaxSize = 100; /利用队列的方法对树进行层序遍历BiNode* QMaxSize;BiNode* q;/ 如果节点为空,返回空/ 若节点不为空,则该节点入
8、队while (front ! /只要队列不为空,则节点依次出队 Release(BiNode* root)/析构函数,释放存储空间 if (root != NULL) Release(root-/释放左子树/释放右子树delete root;BiTree shu;通过对结果的分析,发现输出结果与建立二叉树时的输入完全符合,说明程序的运行结果是正确的。心得体会:1) 函数递归的方法可以在相当程度上使程序简洁,避免代码的冗长复杂。 2) 构造函数如果带参数,在声明对象的时候应该将实参指出来。但是本题中构造函数位递归调用,初始的根节点的数据值由键盘输入,因此无法在声明对象时引入实参。所以最后选择了
9、无参但是引用了this指针的构造函数。可见,对于构造函数的含参调用应该小心谨慎。3) 编程时,要不停得检验自己的输入与输出,必要的时候需要人工进行计算,以保证程序的运行按照预先的设想。第二篇:数据结构 树和二叉树代码树和二叉树 一、实验目的:参照给定的二叉树类的程序样例,验证给出的有关二叉树的常见算法,并实现有关的操作。二、实验要求:1、掌握二叉树、哈夫曼树和树的特点。掌握它们的常见算法。2、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。三、实验内容:1设计实现二叉树类,要求:(1)编写一个程序,首先建立不带头结点的二叉链式存
10、储结构的二叉树,然后分别输出按照前序遍历二叉树、中序遍历二叉树和后序遍历二叉树访问各结点的序列信息,最后再测试查找函数和撤销函数的正确性。 (2)实现二叉树层次遍历的非递归算法。(3) 假设二叉树采用链式存储结构进行存储,编写一个算法,输出一个二叉树的所有叶子结点,并统计叶子结点个数。(4)编写求二叉树高度的函数 (5)编写一主函数来验证算法实现。 2. 设计实现二叉线索链表类,要求:(1)编写一个程序,首先建立中序线索链表的二叉树,然后实现中序线索链表的遍历算法。(2)编写一主函数来验证算法实现。 *3. 编写创建哈夫曼树和生成哈夫曼编码的算法。*4假设二叉树采用链式存储结构进行存储,试设计
11、一个算法,输出从每个叶子结点到根结点的路径。*5假设二叉树采用链式存储结构进行存储,试设计一个算法,求二叉树的宽度(即具有结点数最多的层次上结点总数) 四、程序样例 #include #include using namespace std; template struct BiNode T data; BiNode *lchild, *rchild; int max(int a,int b) return a b ? a : b; template class BiTree public: /构造函数,初始化一棵空的二叉树BiTree()/二叉树的析构函数算法BiTree Release(r
12、oot); void InOrder() InOrder(root); /中序遍历二叉树void PreOrder() PreOrder(root); void PostOrder()PostOrder(root); /后序遍历二叉树void LeverOrder()LeverOrder(root); /层序遍历二叉树void Count()Count(root); void PreOrdercnt()PreOrdercnt(root); int Depth()int www = Depth(root); return www; private: BiNode *root; /指向根结点的头指
13、针void Creat(BiNode *&root); void PreOrder(BiNode *root); /前序遍历二叉树 void InOrder(BiNode *root); void PostOrder(BiNode *root); void LeverOrder(BiNode *root); /层序遍历二叉树 /析构函数调用 void Count(BiNode *root) ;/求二叉树的结点个数 void PreOrdercnt(BiNode *root);/设计算法按前序次序打印二叉树中的叶子结点; int Depth(BiNode *root);/深度;BiTree()
14、Creat(root); template void BiTree :Creat(BiNode *&root) char ch; cinch; if (ch=#) root=NULL; /建立一棵空树else root=new BiNode; /生成一个结点data=ch;Creat(root- /递归建立左子树 /递归建立右子树 template void BiTree:LeverOrder(BiNode *root) BiNode * Q100; int front = 0, rear = 0; /采用顺序队列,并假定不会发生上溢 if (root=NULL) return; Q+rear
15、=root; while (front!=rear) BiNode * q=Q+front; coutdatalchild!=NULL) Q+rear=q- if (q-rchild! template void BiTree:PostOrder(BiNode *root) if (root = NULL) return; /递归调用的结束条件PostOrder(root- /后序递归遍历root的左子树PostOrder(root - rchild); template void BiTree:PreOrder(BiNode *root) if (root =NULL) return;cou
16、tdatalchild); /前序递归遍历root的左子树PreOrder(root- /前序递归遍历root的右子树 template void BiTree :Release(BiNode *root) if (root!=NULL) /释放左子树 /释放右子树 InOrder (BiNode *root)/二叉树的中序遍历递归算法InOrder if (root=NULL) return;InOrder(root- /中序递归遍历root的左子树 /中序递归遍历root的右子树 int n = 0; template void BiTree:Count(BiNode *root) /n为
17、全局量并已初始化为0 if (root) Count(root- n+; /求二叉树的结点个数 Count(root- int cnt = 0;PreOrdercnt(BiNode *root)/设计算法按前序次序打印二叉树中的叶子结点; if (root) if (!lchild & !rchild) coutdata cnt+; PreOrdercnt(root- PreOrdercnt(root- template int BiTree:Depth(BiNode *root)/算法求二叉树的深度 if (root=NULL) return 0; else int hl= Depth(ro
18、ot- int hr= Depth(root - return max(hl, hr)+1; int main() BiTree mytree; coutenum flag Child, Thread; /枚举类型,枚举常量Child=0,Thread=1 template struct ThrNode /二叉线索树的结点结构 T data; ThrNode *lchild, *rchild; flag ltag, rtag;template class InThrBiTree public: InThrBiTree( ); /构造函数,建立中序线索链表 InThrBiTree( ); /析构
19、函数,释放线索链表中各结点的存储空间ThrNode* Getroot( ); /获取根结点 ThrNode* Next(ThrNode* p); /查找结点p的后继 void InOrder(ThrNode* root); /中序遍历线索链表 private: ThrNode* root; /指向线索链表的头指针 ThrNode* Creat( ); /构造函数调用 void ThrBiTree(ThrNode* root); /构造函数调用 void Release(ThrNode* root); /析构函数调用 ; #endif /定义类InThrBiTree中的成员函数,文件名为inth
20、rbitree.cpp #include #include #includeinthrbitree.h using namespace std; /构造一棵中序线索二叉树 template InThrBiTree:InThrBiTree( ) ThrNode* pre = NULL; this- ThrBiTree(root); /释放中序线索二叉链表中各结点的存储空间 template InThrBiTree:InThrBiTree(void) Release(root); /获取指向中序线索二叉树根结点的指针 template ThrNode* InThrBiTree:Getroot( )
21、 return root; /输出指向结点p的后继结点的指针 template ThrNode* InThrBiTree:Next(ThrNode* p) ThrNode* q; if (p-rtag=Thread) q = p- /右标志为1,可直接得到后继结点 else q = p- /工作指针初始化 while (q-ltag=Child) /查找最左下结点 q = q- return q;/中序遍历一棵线索二叉树 template void InThrBiTree:InOrder(ThrNode *root) ThrNode* p = root; /如果线索链表为空,则空操作返回 wh
22、ile (p-ltag=Child) /查找中序遍历序列的第一个结点p并访问 p = p- coutdatarchild!=NULL) /当结点p存在后继,依次访问其后继结点 p = Next(p); coutdata ThrNode* InThrBiTree:Creat( ) ThrNode *root; T ch; if (ch=#root=new ThrNode; /生成一个结点 root-data = ch; root-ltag = Child;rtag = Child;lchild = Creat( ); /递归建立左子树 root-rchild = Creat( ); /递归建立右子树 return root; /给二叉树建立线索 template void InThrBiTree:ThrBiTree(ThrNode *root) if (root=NULL) return; /递归结束条件 ThrBiTree(root- if (!lchild) /对root的左指针进行处理 root-ltag = Thread; roo
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1