您好,登錄后才能下訂單哦!
從上往下打印出二叉樹的每個結點,同一層的結點按照從左到右的順序打印。例如如下二叉樹打印出的結果為1、2、3、4、5、6、7、8、9。
上面所說的也就是二叉樹的層序遍歷,對于層序遍歷來說,首先訪問的肯定是根節點,然后是其左右結點,之后就是左子樹的左右結點和右子樹的左右結點,依次往下,如果使用像前中后序遍歷那樣按照左右結點去遞歸打印的話肯定是不行的,因為并不能一直先訪問某個左結點或者右結點,而是應該左右交叉訪問;
上面的二叉樹中,打印的順序是1、2、3、4、5、6、7、8、9,可以想到按照隊列的方式依次將其放入其中,而先進先出,得到的也就是打印的順序,至于如何存放,可以先將根結點放入其中,拿到隊首結點,如果隊首結點的左右結點不為NULL,就依次放入隊列中,然后將隊首元素pop出,再循環取隊首元素進行判斷放入......直至遍歷完二叉樹且隊列為空為止;
程序設計如下:
#include <iostream> #include <assert.h> #include <queue> using namespace std; struct BinaryTreeNode//二叉樹結點結構體 { int _val; BinaryTreeNode *_Lnode; BinaryTreeNode *_Rnode; BinaryTreeNode(int val)//構造函數 :_val(val) ,_Lnode(NULL) ,_Rnode(NULL) {} }; BinaryTreeNode* _Create(int *arr, size_t& index, size_t size)//前序方式創建二叉樹 { 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)//前序遍歷二叉樹,為了觀察二叉樹是否創建好 { 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; }
運行程序:
《完》
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。