【死磕算法系列】二叉树的层次遍历

            a
          /   \
          b      c
        /   \   /  \    
       d    e  f    g
           /
          h
            \
              i

对于上面的二叉树,层次遍历结果为:

a
b   c
d   e   f   g
h
i

java实现:

public void levelTraverse(TreeNode node){
    if(node == null){
       return;
    }
    Queue<TreeNode> queue=new LinkedList<TreeNode>();
    queue.add(node);
    int cur,last;
    TreeNode current=null;
    while(!queue.isEmpty()){
       cur=0;
       last=queue.size();
       while(cur<last){
          cur++;
          current=queue.poll();
          System.out.print(current.val+"\t");
          if(current.left!=null){
             queue.add(current.left);
          }
          if(current.right!=null){
              queue.add(current.right);
          }
       }
       System.out.println();
    }
}

打印结果:

a   
b   c   
d   e   f   g   
h   
i

放到集合中返回:

    public ArrayList<String> levelTraverseV2(TreeNode node){
        ArrayList<String> list=new ArrayList<String>();
        if(node == null){
           return list;
        }
        Queue<TreeNode> queue=new LinkedList<TreeNode>();
        queue.add(node);
        int cur,last;
        TreeNode current=null;
        while(!queue.isEmpty()){
           cur=0;
           last=queue.size();
           while(cur<last){
              cur++;
              current=queue.poll();
              list.add(current.val);
              if(current.left!=null){
                 queue.add(current.left);
              }
              if(current.right!=null){
                  queue.add(current.right);
              }
           }
        }

        return list;
    }

打印结果:

[a, b, c, d, e, f, g, h, i]

每一层放到一个集合中,再次改进:

    public ArrayList< ArrayList<String>> levelTraverseV3(TreeNode node){
        ArrayList< ArrayList<String>> list=new ArrayList< ArrayList<String>>();
        if(node == null){
           return list;
        }
        Queue<TreeNode> queue=new LinkedList<TreeNode>();
        queue.add(node);
        int cur,last;
        TreeNode current=null;
        while(!queue.isEmpty()){
           cur=0;
           last=queue.size();
           ArrayList<String> level=new ArrayList<String>();
           while(cur<last){
              cur++;
              current=queue.poll();
              level.add(current.val);
              if(current.left!=null){
                 queue.add(current.left);
              }
              if(current.right!=null){
                  queue.add(current.right);
              }
           }
           list.add(level);
        }

        return list;
    }

打印结果:

[[a], [b, c], [d, e, f, g], [h], [i]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

esc_ai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值