题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
牛客传送门:点击打开链接
import java.util.*;
public class Title61 {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
// 所求结果
ArrayList<ArrayList<Integer> > result = new ArrayList<ArrayList<Integer> >();
if(pRoot == null)
return result; // 这里返回的不是null
// 每层的数据,加入result
ArrayList<Integer> line = new ArrayList<Integer>();
// 是否反转
boolean isRotate = true;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(pRoot);
line.add(pRoot.val);
result.add(line);
// 用于反转
Stack<Integer> stack = new Stack<Integer>();
while(!queue.isEmpty()){
// 上一层的总数
int count = queue.size();
// 重置
line = new ArrayList<Integer>();
if(isRotate){
while(count-- > 0){
TreeNode node = queue.poll();
if(node.left != null){
queue.add(node.left);
stack.add(node.left.val);
}
if(node.right != null){
queue.add(node.right);
stack.add(node.right.val);
}
}
// 将栈中的数添加到line中
while(!stack.isEmpty()){
line.add(stack.pop());
}
}else{
while(count-- > 0){
TreeNode node = queue.poll();
if(node.left != null){
queue.add(node.left);
line.add(node.left.val);
}
if(node.right != null){
queue.add(node.right);
line.add(node.right.val);
}
}
}
if(line.size() >0)
result.add(line);
// 下一层反转
isRotate = !isRotate;
}
return result;
}
/**
* 测试用例
* 1
* 2 3
* 4 5 6 7
* 8 9
*/
public static void main(String[] args) {
TreeNode a = new TreeNode(1);
TreeNode b = new TreeNode(2);
TreeNode c = new TreeNode(3);
TreeNode d = new TreeNode(4);
TreeNode e = new TreeNode(5);
TreeNode f = new TreeNode(6);
TreeNode g = new TreeNode(7);
TreeNode h = new TreeNode(8);
TreeNode i = new TreeNode(9);
a.left = b;a.right = c;
b.left = d;b.right = e;c.left = f;c.right = g;
d.left = h;d.right = i;
ArrayList<ArrayList<Integer> > result = new Title61().Print(a);
for(ArrayList<Integer> line : result){
System.out.println(line);
}
/*[1]
[3, 2]
[4, 5, 6, 7]
[9, 8]
*/
}
}