笔试面试算法经典--二叉树层次打印

【题目描述】
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

例如下面的树输出为:
12
5 18
2 9 15 19
17
16

《笔试面试算法经典--二叉树层次打印》

解法:
用队列来保存每层的节点,使用层次遍历,记录每层节点的个数,每层节点的个数其实是当前队列中没有加入任何子节点是队列的大小,然后将一行全部输出的同时将其子节点加入到队列。如上面图中,先将12 放入到队列中,此时队列的长度为1,然后将12 输出,8 18进入到队列中此时队列的长度刚好为2。因此可知队列的长度正好对应每行节点的个数。

/*class TreeNode{ int val; TreeNode left=null; TreeNode right=null; public TreeNode(int val) { this.val = val; } } */
//本算法没有打印每行节点而是将每行节点保存在不同的list中。
public static ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {

        ArrayList<ArrayList<Integer> > listAll=new ArrayList<ArrayList<Integer>>();
        if(pRoot==null)
            return listAll;
        TreeNode cur;
        Queue<TreeNode> queue=new LinkedList<TreeNode>();
        queue.add(pRoot);
    //将根节点入队。 
        while(!queue.isEmpty())
        {
            int i=0;
            int len=queue.size();
            //用len记录当前队列的长度,也就是当前行的节点个数。
            ArrayList<Integer> list=new ArrayList<Integer>();
            while(i<len)
            {
            //将当前行中的节点输出的同时,将其子节点进入队列中
                cur=queue.poll();
                if(cur.left!=null)              
                    queue.add(cur.left);                
                if(cur.right!=null)
                    queue.add(cur.right);
                i++;
                list.add(cur.val);              
            }
            listAll.add(list);          
        }
        return listAll;

    }
    原文作者:HankingHu
    原文地址: https://blog.csdn.net/u013309870/article/details/70148574
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞