1. 程式人生 > >二叉樹層序遍歷與獲取二叉樹深度的應用

二叉樹層序遍歷與獲取二叉樹深度的應用

不同於中序、前序、和後續遍歷使用棧,層序遍歷使用的是佇列!

程式碼如下:

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語言版)---機械工業出版社