《剑指offer》—— 60 从上到下按层打印二叉树

题目

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

思路
  • 类似32从上到下打印二叉树,用队列存储二叉树。一个节点出队的同时进数组,然后左右子节点入队。
  • 根节点的左右子节点入队后,队列长度=2;记录数组大小,当数组=2时(即左右子节点出队进数组,其左右子节点又进队了,当前队列长度=4),将当前数组作为一行加入结果数组,然后重置队列长度、数组、数组大小。
代码
package nowcoder;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

/*
 * 60: 从上到下打印二叉树,同一层输出一行
 */
public class TreePrintBSTSplit {
	
	public static void main(String []args) {
		TreeNode root = new TreeNode(1);
		root.left = new TreeNode(2);
		root.right = new TreeNode(3);
		
		ArrayList<ArrayList<Integer>> result = Print(root);
		
		for(int i=0;i<result.size(); i++) {
			for(int j=0;j<result.get(i).size();j++) {
				System.out.print(result.get(i).get(j));
			}
			System.out.println();
		}
	}
	
	
	static ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
	    Queue<TreeNode> queue = new LinkedList<>();
	    
	    ArrayList<ArrayList<Integer>> re = new ArrayList<>();
	    
	    if (pRoot == null) return re;
	    
	    queue.add(pRoot);
	    
	    ArrayList<Integer> arr = new ArrayList<>();
	    
	    //num记录当前arr元素个数,即这一行已经进来的元素
	    //end记录这一层该打印的个数,当二者相等则输出一行
	    int num = 0, end = 1;        
	    
	    while(!queue.isEmpty()) {
	    	TreeNode cur = queue.poll();
	    	arr.add(cur.val);
	    	num++;
	    	
	    	if (cur.left != null) {
	    		queue.add(cur.left);
	    	}
	    	
	    	if (cur.right != null) {
	    		queue.add(cur.right);
	    	}
	    	
	    	if (num == end) {
	    		re.add(arr);
	    		arr = new ArrayList<>();
	    		end = queue.size();
	    		num = 0;
	    	}
	    }
	    
	    return re;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值