二叉树的层次遍历(分层输出)

题目描述
  给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)
例如:
给定的二叉树是{3,9,20,#,#,15,7}
在这里插入图片描述
该二叉树层序遍历的结果是

[[3], [9,20], [15,7] ]

分析

  • 二叉树的层次遍历可以用 BFS 来实现,使用一个队列 queue 来实现
  • 要区分每一层节点的个数,可以考虑每次访问时,访问同一层的所有元素,将下一层的所有元素放入队列(使用 size 函数来计算一层节点数)

程序设计

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */

class Solution {
public:
    vector<vector<int> > levelOrder(TreeNode* root) {
        // write code here
        vector<vector<int> > res;
        queue<TreeNode*> q;
        if (root == NULL) return res;
        q.push(root);
        vector<int> v;
        while(!q.empty()){
            v.clear();
            
            // 将同一层的节点全部出队
            int size = q.size();
            while (size--){
                TreeNode* temp = q.front();
                v.push_back(temp->val);
                if (temp->left) q.push(temp->left);		// 下一层所有节点入队
                if (temp->right) q.push(temp->right);
                q.pop();
            }
            res.push_back(v);	// 存储当前层的节点输出
        }
        return res;
    }
};
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树层次遍历是一种广度优先搜索的算法,可以使用队列来实现。以下是一个示例的二叉树层次遍历输出的代码: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def levelOrder(root): if not root: return [] result = [] queue = [root] while queue: level = [] size = len(queue) for _ in range(size): node = queue.pop(0) level.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) result.append(level) return result ``` 这段代码中,我们定义了一个`TreeNode`类来表示二叉树的节点。`levelOrder`函数接受一个二叉树的根节点作为参数,返回一个二维列表,表示二叉树层次遍历结果。 在函数内部,我们首先判断根节点是否为空,如果为空则直接返回空列表。然后初始化一个空列表`result`用于存储最终的结果,以及一个队列`queue`用于辅助层次遍历。 接下来,我们使用一个循环来进行层次遍历。在每一层的循环中,我们首先创建一个空列表`level`用于存储当前层的节点值。然后获取当前队列的长度`size`,表示当前层的节点个数。 接着,我们使用一个内部循环来遍历当前层的节点。在每次循环中,我们从队列中弹出一个节点,并将其值添加到`level`列表中。然后判断该节点是否有左右子节点,如果有则将其左右子节点加入队列。 内部循环结束后,将`level`列表添加到`result`列表中,表示当前层的节点值已经遍历完。 最后,当队列为空时,表示所有层的节点都已经遍历完毕,我们返回`result`列表作为最终的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值