题目:
给定一个二叉树的根节点,逐层遍历该节点的所有值,并打印结果。
思路:
层序遍历,顾名思义就是由上往下一层一层的遍历节点,因此可以使用bfs(广度优先搜索)来遍历整个二叉树
- 首先设置一个队列queue来存放树中的节点,再设置一个List集合res来存放层序遍历的所有记录
- 只要队列不为空,说明还有节点,一直遍历,每次进入while循环先取出当前队列的节点容量,也就是当前层的节点数目curLevelSize
- 每次while循环都弹出curLevelSize个节点,也就是遍历完这一层的节点,并设置一个List集合curLevelNode来存放当前层的节点,在弹出遍历节点的同时将该节点加入到集合curLevelNode中,并判断该节点是否有左节点,右节点,如果有就加入到队列queue中
- 每次循环结束就将该curLevelNode集合加入到总集合res中
- 循环结束,说明节点遍历完成,返回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;
笔者也在不断学习的阶段,如有错误,欢迎指正!
 
                   
                   
                   
                   本文详细介绍了两种方法实现二叉树的层序遍历,分别是利用队列的广度优先搜索(BFS)策略以及通过记录节点层数的方法。在Java中,通过创建队列和节点集合,逐层遍历并收集节点值,最终返回层次遍历的结果。同时,文章指出第二种方法虽然能实现功能,但因额外的空间开销和较低的时间效率,推荐使用第一种方法。
本文详细介绍了两种方法实现二叉树的层序遍历,分别是利用队列的广度优先搜索(BFS)策略以及通过记录节点层数的方法。在Java中,通过创建队列和节点集合,逐层遍历并收集节点值,最终返回层次遍历的结果。同时,文章指出第二种方法虽然能实现功能,但因额外的空间开销和较低的时间效率,推荐使用第一种方法。
           
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                   247
					247
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            