把二叉树打印成多行

2019-08-25  本文已影响0人  天涯的尽头s风沙

题目描述

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

demo1

import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
         //res用来存储每一个arraylist
        ArrayList<ArrayList<Integer> > res = new ArrayList<ArrayList<Integer> >();
        //arraylist用来存储每一行的数据
        ArrayList<Integer> arraylist = new ArrayList<Integer>();
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        if(pRoot==null){
            return res;
        }
        //将根节点pRoot入队列
        queue.offer(pRoot);
        //start记录本层打印了多少个,end记录下一层要打印多少个
        int start = 0,end=1;
        while(!queue.isEmpty()){
             //只要队列不为空就执行下面的操作
            //首先将当前节点出队列
            TreeNode treenode = queue.poll();
            //将当前节点的值val添加进arraylist
            arraylist.add(treenode.val);
            //打印的个数加1
            start++;
            //判断是否存在左右节点,并各自入队列
            if(treenode.left!=null){
                queue.offer(treenode.left);
            }
            if(treenode.right!=null){
                queue.offer(treenode.right);
            }
            //当已经打印的个数已经达到该层需要打印的数量时
            if(start==end){
                //重置start和end,end值即为当前queue的容量,也就是下一次需要打印的次数
                start=0;
                end = queue.size();
                //一行打印完成将该行的arraylist添加到res中
                res.add(arraylist);
                //清空arraylist,为添加下一行数据做准备
                arraylist = new ArrayList<Integer>();
            }   
        }
        return res;    
    }  
}

demo2

import java.util.ArrayList;
/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<TreeNode> treenode = new ArrayList<TreeNode>();
        ArrayList<TreeNode> treenodenew = new ArrayList<TreeNode>();
        ArrayList<Integer> arraylist = new ArrayList<Integer>();
        ArrayList<ArrayList<Integer> > res = new ArrayList<ArrayList<Integer> >();
        if(pRoot==null)
            return res;
        treenode.add(pRoot);//添加第一行的节点
        arraylist.add(pRoot.val);//添加第一行的数据
        res.add(arraylist);//添加第一行的数组
        while(!treenode.isEmpty()){
            arraylist = new ArrayList<Integer>();//清空上一行的arraylist数据
            for(int i=0;i<treenode.size();i++){//遍历每个节点
                if(treenode.get(i).left!=null){//若当前节点存在左节点
                    treenodenew.add(treenode.get(i).left);//将左节点存入新的节点数组
                    arraylist.add(treenode.get(i).left.val);//将左节点数据存入该行的arraylist数组
                }
                if(treenode.get(i).right!=null){//右节点同理
                    treenodenew.add(treenode.get(i).right);
                    arraylist.add(treenode.get(i).right.val);
                }
            }
            treenode.clear();//将上层节点数组清空
            for(int i=0;i<treenodenew.size();i++){//将当前节点数组拷贝至treenode
                treenode.add(treenodenew.get(i));
            }
            //treenode=treenodenew;
            if(!treenodenew.isEmpty())//如果当前节点不为空(有值),就添加进res
                res.add(arraylist);
            treenodenew.clear();//将该层节点清空
        }
       return res;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读