二叉樹層序遍歷與獲取二叉樹深度的應用
阿新 • • 發佈:2018-12-12
不同於中序、前序、和後續遍歷使用棧,層序遍歷使用的是佇列!
程式碼如下:
void level_order(tree_pointer ptr){ int front = rear = 0; tree_pointer queue[MAX_QUEUE_SIZE]; if(!ptr) return ; /* empty tree*/ addq(front, &rear, ptr); while(1){ ptr = deleteq(&rear, ptr); if(ptr) { printf("%d",ptr -> data); if(ptr->left_child) addq(front, &rear, ptr->left_child); if(ptr->right_child) addq(front, &rear, ptr->right_child); } //addq是迴圈佇列插入函式: void addq(int front, int *rear, tree_pointer ptr){ *rear = (*rear+1) % MAX_QUEUE_SIZE; if(front == *rear){ queue_full(rear); reutrn ; } queue[*rear] = item; } //deleteq 是迴圈佇列刪除 element deleteq(int *front, int rear){ element item; if(*front == rear) return queue_empty(); *front = (*front+1) % MAX_QUEUE_SIZE; reutrn queue[*front]; }
層序遍歷如何與二叉樹深度結合:
在層序遍歷中,不使用迴圈佇列而使用普通佇列也是可以的。
分析程式碼:
void level_order(tree_pointer ptr){ int front = rear = 0; tree_pointer queue[MAX_QUEUE_SIZE]; if(!ptr) return ; /* empty tree*/ addq(front, &rear, ptr); //先將二叉樹的頭結點放入佇列中,此時佇列中只存在一個結點; while(1){ ptr = deleteq(&rear, ptr); //輸出儲存的結點,然後對其左右兒子進行操作; if(ptr) { printf("%d",ptr -> data); if(ptr->left_child) //若左兒子不為空則左兒子入列; addq(front, &rear, ptr->left_child); if(ptr->right_child) //若右兒子不為空則右兒子也入列; addq(front, &rear, ptr->right_child); } /* 根據上述程式碼分析可知: 層序遍歷是分別將每一層的結點放入佇列進行操作,若要放入下一層則訪問這一層結點的左右兒子。 */
所以可以利用這個特點,在放入下一層結點時,對深度depth進行累加。
此時需要判斷這一層的結點是否全部操作完,此時就要對已入列的size進行判斷。
程式碼如下:
int Depth(TreeNode* head,int &depth){ if (head == nullptr) return 0; int depth = 0; queue<TreeNode*> que; que.push(head); while (!que.empty()) { depth++; int count = 0; int size = que.size(); while (count < size) { //彈出當前層的所有節點 TreeNode *front = que.front(); que.pop(); count++; if (front->left) que.push(front->left); if (front->right) que.push(front->right); } } return depth; }
//參考文獻:資料結構(C語言版)---機械工業出版社