二叉树层序遍历与获取二叉树深度的应用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/XUCHEN1230/article/details/84036565

不同于中序、前序、和后续遍历使用栈,层序遍历使用的是队列!

代码如下:

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语言版)---机械工业出版社

猜你喜欢

转载自blog.csdn.net/XUCHEN1230/article/details/84036565
今日推荐