二叉树的层序遍历(队列)

层序遍历就是逐层遍历树结构。

广度优先搜索是一种广泛运用在树或图这类数据结构中,遍历或搜索的算法。 该算法从一个根节点开始,首先访问节点本身。 然后遍历它的相邻节点,其次遍历它的二级邻节点、三级邻节点,以此类推。

当我们在树中进行广度优先搜索时,我们访问的节点的顺序是按照层序遍历顺序的。,说简单点就是一层遍历完遍历下一层。

层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。

需要借用一个辅助数据结构队列来实现,队列先进先出,符合一层一层遍历的逻辑,而是用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。

解题思路:先入队一个节点,然后把这个节点的数据取出放入临时数组中,如果这个结点有左孩子那就把左孩子入队,头孩子同理,下面大家看看图就明白了

1:首先我们把头节点入队,此时队列的size为1。

                         

2.获取队列头部的结点,把这个结点的val添加进临时数组中,然后出队,因为这个结点既有左孩子也有右孩子,所以把左右孩子均入队,入队后size变为了2,如下图

                           

3.还是老样子,获取队头结点,把该节点的数据存放到临时数组,然后出队,判断2这个结点有没有左右孩子,有的话入队,因为没有所以不做操作。   

                        

4.现在应该知道我要做什么了,还是获取队头的结点,把该节点的数据存放到临时数组,然后出队,判断3这个结点的左右孩子情况,把左右孩子均放入队列。

                         

5.依次获取队头结点,将每个结点对应的val放入临时数组,然后出队,判断后均无左右孩子所以不执行入队。队列为空结束。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> res;
        if(root==NULL)
        {
            return res;
        }
        queue<TreeNode*> a;
        a.push(root);//放入根节点
        while(!a.empty())
        {
            vector<int> tmp;//临时数组
            int len=a.size();
            for(int i=0;i<len;i++)
            {
                TreeNode*tmpnode=a.front();//把队列的头部拿出来
                a.pop();//出队
                tmp.push_back(tmpnode->val);//放入临时数组
                if(tmpnode->left)//如果该结点有左孩子那就放入队列
                {
                    a.push(tmpnode->left);//入队
                }
                if(tmpnode->right)//如果存在右孩子,那就还是入队
                {
                    a.push(tmpnode->right);//入队
                }
            }
            res.push_back(tmp);//把临时数组的数据添加到二维数组
        }
        return res;
    }
};

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树层序遍历是一种广度优先搜索算法,它按照从上到下、从左到右的顺序遍历二叉树的每个节点。而C队列是一种先进先出的数据结构,可以用来实现二叉树层序遍历。具体实现方法是,先将根节点入队,然后依次取出队首节点,将其左右子节点入队,直到队列为空。这样就可以按照层序遍历的顺序遍历整个二叉树了。 下面是一个简单的C语言实现二叉树层序遍历的代码,其中使用了C队列: ``` #include <stdio.h> #include <stdlib.h> #include "tree.h" // 引用二叉树的头文件 #define MAX_QUEUE_SIZE 100 // 队列的最大长度 // 定义队列结构体 typedef struct { BTNode* data[MAX_QUEUE_SIZE]; int front, rear; } Queue; // 初始化队列 void initQueue(Queue* q) { q->front = q->rear = 0; } // 判断队列是否为空 bool isQueueEmpty(Queue* q) { return q->front == q->rear; } // 判断队列是否已满 bool isQueueFull(Queue* q) { return (q->rear + 1) % MAX_QUEUE_SIZE == q->front; } // 入队 void enqueue(Queue* q, BTNode* node) { if (isQueueFull(q)) { printf("Queue is full!\n"); exit(1); } q->data[q->rear] = node; q->rear = (q->rear + 1) % MAX_QUEUE_SIZE; } // 出队 BTNode* dequeue(Queue* q) { if (isQueueEmpty(q)) { printf("Queue is empty!\n"); exit(1); } BTNode* node = q->data[q->front]; q->front = (q->front + 1) % MAX_QUEUE_SIZE; return node; } // 二叉树层序遍历 void TreeLevelOrder(BTNode* root) { if (root == NULL) { return; } Queue q; initQueue(&q); enqueue(&q, root); while (!isQueueEmpty(&q)) { BTNode* node = dequeue(&q); printf("%c ", node->data); if (node->left != NULL) { enqueue(&q, node->left); } if (node->right != NULL) { enqueue(&q, node->right); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值