题解 | #二叉树中和为某一值的路径(二)#
按之字形顺序打印二叉树
http://www.nowcoder.com/practice/91b69814117f4e8097390d107d2efbe0
1、递归:
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
PrintExcute(pRoot,0);
return list;
}
private void PrintExcute(TreeNode pRoot, int deep) {
if(pRoot == null) {
return;
}
if(deep >= list.size()) { //如果当前深度超过list大小,在list中添加新的数组
list.add(deep,new ArrayList<Integer>());
}
if(deep % 2 == 0) { //判断深度奇偶
list.get(deep).add(pRoot.val); //在list的第deep元素的末尾添加值
}else {
list.get(deep).add(0,pRoot.val);//在list的第deep元素的首位添加值
}
PrintExcute(pRoot.left,deep+1); //递归
PrintExcute(pRoot.right,deep+1); //递归
}
2、队列:
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
if(pRoot == null) {
return list;
}
Queue<TreeNode> queueNode = new LinkedList<TreeNode>();;
queueNode.offer(pRoot);
boolean islr = true;
while(!queueNode.isEmpty()) {
ArrayList<Integer> tmpArray = new ArrayList<>(); //临时数组,储存当前深度的树的值
int size = queueNode.size(); //当前队列的大小,也即当前深度的元素的数量
for(int i = 0; i < size; i++) {
TreeNode node = queueNode.poll(); //Queue.pull返回队列的第一个元素并将其移出除队列
if(islr) {
tmpArray.add(node.val); //将元素添加到数组的末尾
}else {
tmpArray.add(0,node.val); //将元素添加到数组的最前
}
if(node.left != null) {
queueNode.offer(node.left); //左子树入队
}
if(node.right != null) {
queueNode.offer(node.right); //右子树入队
}
}
if(tmpArray.size() != 0) {
list.add(tmpArray); //添加到list中
}
islr = !islr; //每次遍历完一次深度修改值,即修改下一深度的排序
}
return list;
}