二叉树基础之按层打印

 

转载请注明原文地址: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;
    }
复制代码
复制代码

 

 

                                                              

posted @   割肉机  阅读(446)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示