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

            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]]
阅读更多

扫码向博主提问

中科院硕士_姚攀

博客专家

熟悉Lucene、ES、ELK
去开通我的Chat快问
版权声明:本文为博主原创文章,未经博主允许禁止转载(http://blog.csdn.net/napoay) https://blog.csdn.net/napoay/article/details/78885800
个人分类: 数据结构与算法
所属专栏: 数据结构与算法
上一篇【死磕算法系列】二叉树的深度
下一篇【死磕算法系列】平衡二叉树的判定
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭