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,就達到目的了。

代碼在我的資源裏面有喔 所有資源都打包好了 可以直接下載就用。

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