二刷10-二叉树层序遍历

刷这道题时十分上火,因为我层专门做过二叉树的题,那时候感觉自己理解的很不错。几个月过去了,我全都不记得了。为什么记忆力这么差呢?????????????????????

二叉树的遍历分为
1.深度优先搜索 dfs 递归,这个是非常常用的,先中后序遍历用它
2、广度,bfs ,这个应用在层序搜索中,也就是一个队列。

所以层序遍历要用到队列,先来一个普通的层序遍历输出一个集合

 public List<Integer> bianLi(TreeNode head){
        Queue<TreeNode> que=new LinkedList<>();
        List<Integer> list=new ArrayList<>();
        que.add(head);
        while(que.size()!=0){
            TreeNode node=que.remove();
            list.add(node.val);
            if(node.left!=null)que.add(node.left);
            if(node.right!=null)que.add(node.right);
            
        }
        return list;
    }

没有测试,但是应该是对的。

但是题目要求要分出层,那便让这一层都入队列,再出队列。
还没出队列之前队列的长度就是每一层的长度(一开始要固定住),这个for循环让这一层的每一个节点出队列,然后把它的子节点加入队列,那么加入的就是新的一层。这样新循环里队列的长度就又变了。

理解起来有点乱呢。

       public List<List<Integer>> levelOrder(TreeNode root) {
        //二叉树的层序遍历,用队列,存它的每一层。

        List<List<Integer>> list=new ArrayList<>();
        Queue<TreeNode> que=new LinkedList<>();
        if (root != null) {
            que.add(root);
        }
        
        //一个for循环就是一层
        while(que.size()!=0){
            int n=que.size();
            List<Integer> list2=new ArrayList<>();
            //每一层;
            for(int i=0;i<n;i++){
                TreeNode node=que.remove();

                list2.add(node.val);
                if(node.left!=null){
                    que.add(node.left);
                }
                if(node.right!=null){
                    que.add(node.right);
                }
            }
            list.add(list2);

        }
        return list;
    }

在每一次for循环里会把那一层全取出来,下一层全入队列,所以下一次的队列长依然是层长啦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值