【二叉树】 按之字形顺序打印二叉树
1、解题思路
使用队列和栈处理每一层的节点
- 使用队列依次存储第
i
层的节点; - 在插入第
i
层某节点的左右孩子节点之前,先将队列中的节点转移至栈中。 - 弹出栈顶节点,根据
height = i + 1
,决定是先插入左子树还是右子树。 - 遍历结束条件为队列为空。
2、代码实现
import java.util.*;
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<ArrayList<Integer>> results = new ArrayList<ArrayList<Integer>>();
LinkedList<TreeNode> list = new LinkedList<TreeNode>();
if(pRoot == null) return results;
int height = 0;
list.add(pRoot);
while(!list.isEmpty()){
LinkedList<TreeNode> stack = new LinkedList<TreeNode>();
TreeNode rear = null; //该层中list的最尾节点
//遍历并写入results
ArrayList<Integer> temp = new ArrayList<Integer>();
Iterator<TreeNode> iter = list.iterator();
while(iter.hasNext()){
TreeNode tn = iter.next();
temp.add(tn.val);
stack.add(tn);
iter.remove();
}
results.add(temp);
height += 1;
TreeNode ptr = null;
while(!stack.isEmpty()){
ptr = stack.pollLast();
if(height % 2 == 0){ //先插入左子树,再插入右子树
if(ptr.left != null) list.add(ptr.left);
if(ptr.right != null) list.add(ptr.right);
}else{
if(ptr.right != null) list.add(ptr.right);
if(ptr.left != null) list.add(ptr.left);
}
}
}
return results;
}
}
注意在使用java同时进行队列遍历和删除操作时,要使用iter.next()
和iter.remove()
,如果使用iter.next()
和list.poll()
会抛出java.util.ConcurrentModificationException
异常。