更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~
T:
题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
解法都在代码注释当中了。
我的code:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
/**
* T: 把二叉树打印成多行
*
* 题目描述
* 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
*
* date: 2015.12.1 15:54
* @author SSS
*
*/
public class Solution {
/**
* 用队列存放,只不过在往队列中添加元素是,记录添加的个数。
* 同时记录上层总共有多少个节点,当前已经遍历了几个节点, 下一层已经添加进去了几个节点
* @param pRoot
* @return
*/
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> resultsList = new ArrayList<ArrayList<Integer>>();
if (pRoot == null) {
return resultsList;
}
Queue<TreeNode> newQueue = new LinkedList<TreeNode>();
newQueue.add(pRoot);
int layerCount = 1; // 当前层的节点的总个数
int upCount = 0; // 当前已经便利过的本层的节点的个数
int downCount = 0; // 下一层的节点个数统计
ArrayList<Integer> nodeList = new ArrayList<Integer>();
while (!newQueue.isEmpty()) {
TreeNode tempNode = newQueue.poll();
nodeList.add(tempNode.val);
upCount ++;
// 若左右节点不为空,则将左右节点都添加进去
if (tempNode.left != null) {
newQueue.add(tempNode.left);
downCount ++;
}
if (tempNode.right != null) {
newQueue.add(tempNode.right);
downCount ++;
}
// 看本层的节点是否已经遍历完
if (upCount == layerCount) {
ArrayList<Integer> tarList = new ArrayList<Integer>();
for (int i = 0; i < nodeList.size(); i++) {
tarList.add(nodeList.get(i));
}
resultsList.add(tarList);
//清空nodeList数组
for (int i = 0; i < layerCount; i++) {
nodeList.remove(0);
}
// 重置为零
upCount = 0;
// 因为要开始遍历下一层,要设置下一层的总个数给layerCount
layerCount = downCount;
// 开始遍历下一层时,就要统计下下层的个数大小
downCount = 0;
}
}
return resultsList;
}
}
更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~