您好,登錄后才能下訂單哦!
從上往下打印出二叉樹的每個結(jié)點,同一層的結(jié)點按照從左到右的順序打印。例如如下二叉樹打印出的結(jié)果為1、2、3、4、5、6、7、8、9。
上面所說的也就是二叉樹的層序遍歷,對于層序遍歷來說,首先訪問的肯定是根節(jié)點,然后是其左右結(jié)點,之后就是左子樹的左右結(jié)點和右子樹的左右結(jié)點,依次往下,如果使用像前中后序遍歷那樣按照左右結(jié)點去遞歸打印的話肯定是不行的,因為并不能一直先訪問某個左結(jié)點或者右結(jié)點,而是應(yīng)該左右交叉訪問;
上面的二叉樹中,打印的順序是1、2、3、4、5、6、7、8、9,可以想到按照隊列的方式依次將其放入其中,而先進(jìn)先出,得到的也就是打印的順序,至于如何存放,可以先將根結(jié)點放入其中,拿到隊首結(jié)點,如果隊首結(jié)點的左右結(jié)點不為NULL,就依次放入隊列中,然后將隊首元素pop出,再循環(huán)取隊首元素進(jìn)行判斷放入......直至遍歷完二叉樹且隊列為空為止;
程序設(shè)計如下:
#include <iostream> #include <assert.h> #include <queue> using namespace std; struct BinaryTreeNode//二叉樹結(jié)點結(jié)構(gòu)體 { int _val; BinaryTreeNode *_Lnode; BinaryTreeNode *_Rnode; BinaryTreeNode(int val)//構(gòu)造函數(shù) :_val(val) ,_Lnode(NULL) ,_Rnode(NULL) {} }; BinaryTreeNode* _Create(int *arr, size_t& index, size_t size)//前序方式創(chuàng)建二叉樹 { if((index < size) && (arr[index] != '#')) { BinaryTreeNode *root = new BinaryTreeNode(arr[index]); root->_Lnode = _Create(arr, ++index, size); root->_Rnode = _Create(arr, ++index, size); return root; } else return NULL; } BinaryTreeNode* CreateBinaryTree(int *arr, size_t size) { assert(arr && size); size_t index = 0; return _Create(arr, index, size); } void DestoryBinaryTree(BinaryTreeNode* root)//銷毀二叉樹 { if(root != NULL) { DestoryBinaryTree(root->_Lnode); DestoryBinaryTree(root->_Rnode); delete root; root = NULL; } } void LevelOrderBinaryTree(BinaryTreeNode *root)//層序遍歷二叉樹 { assert(root); queue<BinaryTreeNode*> q; q.push(root); while(!q.empty()) { if(q.front()->_Lnode != NULL) q.push(q.front()->_Lnode); if(q.front()->_Rnode != NULL) q.push(q.front()->_Rnode); cout<<q.front()->_val<<" "; q.pop(); } cout<<endl; } void PrevOrder(BinaryTreeNode* root)//前序遍歷二叉樹,為了觀察二叉樹是否創(chuàng)建好 { if(root != NULL) { cout<<root->_val<<" "; PrevOrder(root->_Lnode); PrevOrder(root->_Rnode); } } int main() { int arr[] = {1,2,4,'#','#',5,8,'#','#','#',3,6,'#','#',7,'#',9,'#','#'}; BinaryTreeNode *root = CreateBinaryTree(arr, sizeof(arr)/sizeof(arr[0])); cout<<"PrevOrder: "; PrevOrder(root); cout<<endl; cout<<"LevelOrder: "; LevelOrderBinaryTree(root); DestoryBinaryTree(root); return 0; }
運(yùn)行程序:
《完》
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。