zoukankan      html  css  js  c++  java
  • 二叉树基础之按层打印

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6605916.html 

    (Java中栈、队都可以用LinkedList来实例化,栈的方法:push()/pop();队的方法:offer()/poll())

     

          二叉树的按层打印==两个指针last和newlast:出队的时候把左右儿子入队,同时令newlast保存最新入队的结点当出队的结点为last时,说明这一层遍历完毕,此时队列中存放的是下一层的结点,newlast指向下一层的最后结点位置,所以令last=newlast;继续出队遍历,此时遍历的是新的一层了

     public int[][] printTree(TreeNode root) {
            if(root==null){
                return null;
            }
            //用双层ArrayList暂存按层遍历的结果
            ArrayList<ArrayList<Integer>> nodes = new ArrayList<ArrayList<Integer>>();
            //结点队列
            LinkedList<TreeNode> queue=new LinkedList<TreeNode>();
            queue.offer(root);
            //last记录层的最后结点
            TreeNode last=root;
            //newlast跟踪最新入队结点
            TreeNode newlast=null;
            TreeNode curr=null;
            //每层用一个ArrayList暂存
            ArrayList<Integer> levelnodes=new ArrayList<Integer>();
            
            while(!queue.isEmpty()){   
                //弹出队首,加到当前层ArrayList中
                curr=queue.poll();
                levelnodes.add(curr.val);
                //把左右儿子入队,newlast跟踪新入队的结点
                if(curr.left!=null){
                    newlast=curr.left;
                    queue.offer(newlast);
                }
                if(curr.right!=null){
                    newlast=curr.right;
                    queue.offer(newlast);
                }
                //判断当前出队的元素是否为last,即当前层最后结点。是则更新last指向下一层最后结点,并把当前层结果加到双重list去。
                //然后重新创建一个ArrayList存放下一层的结点
                if(curr==last){
                    last=newlast;
                    nodes.add(levelnodes);
                    levelnodes=new ArrayList<Integer>();
                }
            }
            //根据双重链表大小得到树的层次数
            int depth=nodes.size();
            //创建不定长的二维数组,行数为层数,列数不确定
            int[][] res=new int[depth][];
            int i=0;
            for(ArrayList<Integer> list:nodes){
                //双重链表的一个元素是一个存放了一层结点的ArrayList,遍历它得到一个一维数组
                int[] level=new int[list.size()];
                int j=0;
                for(Integer integer:list){
                    level[j++]=integer;
                }
                //然后把该一维数组赋值给不定长二维数组的行头,得到一层结点
                res[i++]=level;
            }   
            return res;
        }

                                                                  

        

  • 相关阅读:
    IO 单个文件的多线程拷贝
    day30 进程 同步 异步 阻塞 非阻塞 并发 并行 创建进程 守护进程 僵尸进程与孤儿进程 互斥锁
    day31 进程间通讯,线程
    d29天 上传电影练习 UDP使用 ScketServer模块
    d28 scoket套接字 struct模块
    d27网络编程
    d24 反射,元类
    d23 多态,oop中常用的内置函数 类中常用内置函数
    d22 封装 property装饰器 接口 抽象类 鸭子类型
    d21天 继承
  • 原文地址:https://www.cnblogs.com/ygj0930/p/6605916.html
Copyright © 2011-2022 走看看