[牛客]有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。

有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。

给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右排列。保证结点数小于等于500。


import java.util.*;



/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}*/
public class TreePrinter {
    public int[][] printTree(TreeNode root) { 
        int index = 0;   
        ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> temp = new ArrayList<Integer>();
        TreeNode left = root , right = root;
        Queue<TreeNode> q = new LinkedList<TreeNode>();
        q.add(root); 
        while(q.peek() != null){  
            if(q.peek().left != null){
                q.add(q.peek().left); 
                left = q.peek().left;
            }
            if(q.peek().right != null){
                q.add(q.peek().right); 
                left = q.peek().right;
            } 
            TreeNode aNode = q.remove();
            temp.add(aNode.val); 
            if(right == aNode){ 
               right = left;
            if(temp.size() > 0){ 
               list.add(temp); 
               }
               temp = new ArrayList<Integer>(); 
            } 
        } 
        //转换数组
        int[][] result = new int[list.size()][];
        for(int i = 0 ; i < list.size() ; i++){
            temp = list.get(i);
            result[i] = new int[temp.size()];
            for(int j = 0 ; j < temp.size() ;j++){
                result[i][j] = temp.get(j); 
            }
        }
        
        return result;
    }

}

----------------------------------带测试用例--------------------------------

package test;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class test {
	public class TreeNode {
	    int val = 0;
	    TreeNode left = null;
	    TreeNode right = null;
	    public TreeNode(int val) {
	        this.val = val;
	    }
	}
    public int[][] printTree(TreeNode root) {
    	if(root == null) return null;
        List<ArrayList<TreeNode>> list = new ArrayList<ArrayList<TreeNode>>();
        ArrayList<TreeNode> temp = new ArrayList<TreeNode>();
        LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
        TreeNode last = root ;
        TreeNode nlast = root ;
        queue.push(root); 
        while(queue.peek() != null ){  
            if(queue.peek().left != null){
                queue.add(queue.peek().left);
                nlast = queue.peek().left;
            } 
            if(queue.peek().right != null){
                queue.add(queue.peek().right);
                nlast = queue.peek().right;
            } 
            if(last == queue.peek()){ 
                temp.add(queue.pop());
                list.add(temp);
                temp = new ArrayList<TreeNode>();
                last = nlast;
            }else{
                temp.add(queue.pop());  
            }
        }
        
        int[][] result = new int[list.size()][];
        int index = 0 ;
        for(ArrayList<TreeNode> node_list : list){
        	result[index] = new int[node_list.size()];
        	int index1 = 0;
        	for(TreeNode node : node_list){
        		result[index][index1] = node.val; 
        		index1++;
        	}
        	index++; 
        }
        return result;
    }
    
    public static void main(String[] a){
    	test t = new test();
    	TreeNode a1 = t.new TreeNode(1);
    	TreeNode a2 = t.new TreeNode(2);
    	TreeNode a3 = t.new TreeNode(3);
    	TreeNode a4 = t.new TreeNode(4);
    	TreeNode a5 = t.new TreeNode(5);
    	TreeNode a6 = t.new TreeNode(6);
    	TreeNode a7 = t.new TreeNode(7);
    	TreeNode a8 = t.new TreeNode(8);
    	a1.left=a2;
    	a1.right=a3;
    	a2.left=a4;
    	a3.left=a5;
    	a3.right=a6;
    	a5.left=a7;
    	a5.right=a8;
    	t.printTree(a1);
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值