MFC 输出图形正向二叉树



编写二叉树类的成员函数,分别实现以下功能:

交换二叉树中所有节点的左右子树。(将结果输出至文本文件中)

按层次顺序遍历二叉树:首先访问根节点,然后是它的两个孩子节点,然后是孙子节点,依此类推。(将结果输出至屏幕)

求二叉树的宽度,即同一层次上最多的节点数。(将结果输出至屏幕)

 

实验思路

第一步:把实验中给的二叉树图表构造成树(通过函数creatTree实现)第二步:交换二叉树中所有节点的左右子树(通过函数exchangeLeftToRight实现)第三步:层次顺序遍历二叉树(通过函数levelOrder实现)第四步:求二叉树的宽度(通过函数treeWide实现)第五步:输出树的结构(通过函数outPutTree实现),第六步:释放树(通过函数freeTree实现)

 

具体的实现

第一步中的函数void createTree (int a[],int b[],binaryTreeNode* & tree,intsize),传进数组ab,数组tree,数组a大小size。其中数组a存的是树的元素,按后序遍历记录。数组b记录对应元素的子树情况,0表示没有子树,1表示有左子树,2表示有左右子树,3表示右子树。接下来就依据数组b的情况,对应a,构造出树,使tree指针指向树的根节点。

 

第二步中的函数void exchangeLeftToRight (binaryTreeNode* &tree),传进tree指针,首先向右边进行递归,再向左边递归。在其中若遇到tree->rightChild!=NULL|| tree->leftChild!=NULL的情况就交换左右子树,接下来进行递归就达到效果了,其中的函数void exchange(binaryTreeNode* & tree)是用来交换二叉树一个节点的左右子树,最后tree指针指向的树的所有节点的左右子树就都交换了。

 

第三步中的函数void levelOrder (binaryTreeNode* tree),传入tree指针,进行层次遍历,并输出遍历结果(课本有讲解)

 

第四步中的函数int treeWide(binaryTreeNode* tree),传入指针tree,返回树的宽度。构造全局数组thewideth,对于树的每一行中元素的个数进行存储,其中最大的就是树的宽度。在其中调用函数void widethOrder(binaryTreeNode* tree,int wide[],int j=0)来实现对数组thewideth的复制,在递归函数中添加一个参数int j,用来计算这个元素是属于哪一行的,接下来用递归就可以实现。

 

第五步中的函数void outPutTree (binaryTreeNode* tree),传入指针tree,在listbox中输出树的结构。其中调用函数void getLocation(binaryTreeNode* tree,int x=20,int y=0)来得到每一个元素的位置,在structbinaryTreeNode中添加int Zposint Hpos,分别表示元素的纵座标和横座标,函数getLocation通过遍历,计算出元素的纵座标和横座标存入对应元素的结构中。接下来对构建的树层次遍历,构建ele数组和blank数组,用来存数据和对应的横座标的值,其中eleCString类型的,blankint型的,再接下来通过int型的blank数组 构造出string类型的blankNumber数组,blankNumber数组中调用函数CString createString (int x)构造每个元素与前一个元素之间的空格,构造为CString类型存入blankNumber数组中,最后用一个for循环把CString类型的ele数组和blankNumber数组结合成最后带输入的CString数组theFinal,最后输出theFianl,就达到目的了。

代码在我的资源里面有喔 所有资源都打包好了 可以直接下载就用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章