LeetCode102.二叉树的层序遍历

本文详细介绍了两种方法实现二叉树的层序遍历,分别是利用队列的广度优先搜索(BFS)策略以及通过记录节点层数的方法。在Java中,通过创建队列和节点集合,逐层遍历并收集节点值,最终返回层次遍历的结果。同时,文章指出第二种方法虽然能实现功能,但因额外的空间开销和较低的时间效率,推荐使用第一种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

给定一个二叉树的根节点,逐层遍历该节点的所有值,并打印结果。


思路:

层序遍历,顾名思义就是由上往下一层一层的遍历节点,因此可以使用bfs(广度优先搜索)来遍历整个二叉树

  1. 首先设置一个队列queue来存放树中的节点,再设置一个List集合res来存放层序遍历的所有记录
  2. 只要队列不为空,说明还有节点,一直遍历,每次进入while循环先取出当前队列的节点容量,也就是当前层的节点数目curLevelSize
  3. 每次while循环都弹出curLevelSize个节点,也就是遍历完这一层的节点,并设置一个List集合curLevelNode来存放当前层的节点,在弹出遍历节点的同时将该节点加入到集合curLevelNode中,并判断该节点是否有左节点,右节点,如果有就加入到队列queue
  4. 每次循环结束就将该curLevelNode集合加入到总集合res
  5. 循环结束,说明节点遍历完成,返回res集合即可。

以下为代码+注释,结合代码和注释应该好理解一点

//首先定义TreeNode节点
class TreeNode {
		int val;
		TreeNode left;
		TreeNode right;

		TreeNode(int val) {
			this.val = val;
		}
	}
	//层序遍历二叉树
 public List<List<Integer>> levelOrder(TreeNode root) {
 		//设置一个res集合,里面每一个集合都是一层的节点
        List<List<Integer>> res = new ArrayList<>();
        if(root == null)
            return res;
        //设置一个队列存放节点
        Queue<TreeNode> queue = new LinkedList<>();
        //存放当前层的节点
        List<Integer> curLevelNode;
        queue.offer(root);
        while(!queue.isEmpty()){
            //每次都先取出当前层的节点数,之后一个个弹出
            //并将记录节点的集合清零,因为每次都是新的一层
            curLevelNode = new ArrayList<>();
            int curLevelSize = queue.size();
            for(int i = 1; i <= curLevelSize; i++){
            	//将当前层的节点依次弹出并加入到集合中	
                TreeNode node = queue.poll();
                curLevelNode.add(node.val);
                //之后判断是否有孩子,如果有就加入到队列
                if(node.left != null){
                    queue.offer(node.left);
                }
                if(node.right != null){
                    queue.offer(node.right);
                }
            }
            //该层遍历完之后,将该层的集合加入结果集中
            res.add(curLevelNode);
        }
        //最后遍历完成返回总结果
        return res;
    }

第二种方法:设置一个levelMap保存每一个节点的层数,但此种方法多开辟了一个map集合,空间开支较大,并且每次while循环都只能弹出一个节点,时间复杂度不如第一种,了解即可

以下为代码+注释:


public List<List<Integer>> levelOrder(TreeNode root) {
    //方法一:使用一个map存储每一个节点的层数
    List<List<Integer>> res = new ArrayList<>();
        if(root == null)
            return res;
        //设置一个list存放当前层的节点
        List<Integer> curLevelNode = new ArrayList<>();
        //bfs,设置一个队列
        Queue<TreeNode> queue = new LinkedList<>();
        //存放每个节点的层数
        Map<TreeNode,Integer> levelMap = new HashMap<>();
        levelMap.put(root, 1);
        queue.add(root);
        //设置一个变量显示当前层
        int curLevel = 1;
        while(!queue.isEmpty()){
            root = queue.poll();
            int curNodeLevel = levelMap.get(root);
            //如果当前节点处在正在遍历的层,则将它加入此时的list集合
            if(curLevel == curNodeLevel){
                curLevelNode.add(root.val);
            }else{
                //如果已经到了下一层,那么就将上一层的结果加入res集合,并进入下一层
                res.add(curLevelNode);
                curLevelNode = new ArrayList<>();//将当前层节点清零,并将当前节点加入集合
                curLevelNode.add(root.val);
                curLevel++;//当前查看的层数加1
            }
            //最后一层特判,因为每次统计都是统计的上一层的节点
            if(queue.isEmpty() && root.left == null && root.right == null){
                res.add(curLevelNode);
                return res;
            }
            //如果当前节点的左右孩子不为空,就加入队列和map集合
            if(root.left != null){
                queue.add(root.left);
                levelMap.put(root.left, curNodeLevel + 1);
            }
            if(root.right != null){
                queue.add(root.right);
                levelMap.put(root.right, curNodeLevel + 1);
            }
        }
        return res;

笔者也在不断学习的阶段,如有错误,欢迎指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值