• 剑指Offer60:把二叉树打印成多行(Java)


    思路分析

    方法一:
    沿用上一题“按之字形顺序打印二叉树”的思路,用两个队列实现分层,当一个队列空了意味着这一层遍历完了。
    方法二:
    用一个队列,二叉树的分层用每一层个数的来划分

    题目描述

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

    方法一代码:

    import java.util.ArrayList;
    import java.util.Queue;
    import java.util.LinkedList;
    public class Solution {
        ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer> > res=new ArrayList<>();
        Queue<TreeNode> que1=new LinkedList<>();
        Queue<TreeNode> que2=new LinkedList<>();
        que1.offer(pRoot);//Stack,Queue都能用isEmpty()判空
            while(!que1.isEmpty()||!que2.isEmpty()){
                ArrayList<Integer> tmp1=new ArrayList<Integer>();
                ArrayList<Integer> tmp2=new ArrayList<Integer>();
                while(!que1.isEmpty()){//队列为空,即遍历了一层结点
                    TreeNode node=que1.poll();
                    if(node!=null){
                        tmp1.add(node.val);
                        que2.offer(node.left);
                        que2.offer(node.right);
                    }
                }
                if(!tmp1.isEmpty()){
                     res.add(tmp1);
                }
                while(!que2.isEmpty()){
                    TreeNode node=que2.poll();
                    if(node!=null){
                        tmp2.add(node.val);
                        que1.offer(node.left);
                        que1.offer(node.right);
                    }
                }
                if(!tmp2.isEmpty()){
                   res.add(tmp2);
                }
            }
            return res;
        }
    }
    

    方法二代码:

    import java.util.ArrayList;
    import java.util.Queue;
    import java.util.LinkedList;
    public class Solution {
        ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
            ArrayList<ArrayList<Integer> > res =new ArrayList<ArrayList<Integer> >();
            if(pRoot==null){
                return res;
            }
            int index=0;
            int length=1;
            Queue<TreeNode> que=new LinkedList<>();
            que.offer(pRoot);
            ArrayList<Integer> tmp=new ArrayList<Integer>();
            while(!que.isEmpty()){
                TreeNode node=que.poll();
                tmp.add(node.val);
                index++;
                if(node.left!=null){
                    que.offer(node.left);
                }
                if(node.right!=null){
                    que.offer(node.right);
                }
                if(index==length){//意味着遍历完了一层二叉树,像遍历数组一样,index指向从0走到了length-1。
                    res.add(tmp);
                    index=0;
                    length=que.size();
                    tmp=new ArrayList<Integer>();//每一层新建一个ArrayList<Integer>,保存每一层的数值。
                }
            }
            return res;
        }
    }
    
  • 相关阅读:
    vue 拖拽移动(类似于iPhone虚拟home )
    鼠标事件-MouseEvent【转】
    JS快速排序 希尔排序 归并排序 选择排序
    JS 继承
    Centos6 iptables 防火墙设置【转】
    centos6 mongodb 安装
    操作系统中涉及的各种调度算法
    循环队列
    队列
    栈(C++)
  • 原文地址:https://www.cnblogs.com/dongmm031/p/12327870.html
Copyright © 2020-2023  润新知