//解题思路
/*
BFS(O(n),O(n)):
需要使用两个栈(打印层和待打印层要放在独立的两个栈里)
8
6 10
5 7 9 11
具体可看代码注释,同时使用以上二叉树进行演算即可明白
*/
//popStack;打印节点栈
//saveStack:保存待打印层节点栈
//direction:打印方向,true为正向(使用saveStack保存待打印层节点时要先添加左孩子,再添加右孩子),false为反向(要先添加右孩子,再添加左孩子)
private ArrayList<Integer> print(Stack<TreeNode> popStack,Stack<TreeNode> saveStack,boolean direction) {
ArrayList<Integer> result = new ArrayList<>();
while (!popStack.isEmpty()){
TreeNode treeNode = popStack.pop();
result.add(treeNode.val);
if (direction){
if (treeNode.left != null) saveStack.add(treeNode.left);
if (treeNode.right != null) saveStack.add(treeNode.right);
}else {
if (treeNode.right != null) saveStack.add(treeNode.right);
if (treeNode.left != null) saveStack.add(treeNode.left);
}
}
return result;
}
ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
if (pRoot == null) return new ArrayList<>();
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
Stack<TreeNode> stack1 = new Stack<>();//存正向打印的节点
Stack<TreeNode> stack2 = new Stack<>();//存反向打印的节点
stack1.add(pRoot);
while (!stack1.isEmpty() || !stack2.isEmpty()){
//stack1为空,则stack2为打印节点栈,stack1为保存待打印层节点栈,此时反向打印(false)
//反之则stack1为打印节点栈,stack2为保存待打印层节点栈,此时正向打印(true)
result.add(stack1.isEmpty() ? print(stack2,stack1,false) : print(stack1,stack2,true));
}
return result;
}