题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
思路解析
- 每两层各自都有自己的打印的顺序,所以需要考虑如何如何将第一层的打印完了,然后第二层的从另外一个方向进行打印。而且需要将特定的节点顺序传给下一层。因此这里考虑使用两个栈来存储,第一个栈stack1存储第一层打印的顺序,可以记做奇数层打印顺序。第二个栈Stack2存储第二层的打印顺序,可以记做偶数层的打印顺序。在每层遍历完后就pop出遍历过的节点。
代码
import java.util.ArrayList;
import java.util.Stack;
/*
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>> result = new ArrayList<>();
if(pRoot == null) return result;
ArrayList<Integer> singlePath = new ArrayList<>();
Stack<TreeNode> stack1 = new Stack<>();//用于存储奇数层的节点
Stack<TreeNode> stack2 = new Stack();//用于存储偶偶数节点
stack1.push(pRoot);
while(!stack1.isEmpty()||!stack2.isEmpty()){
while(!stack1.isEmpty()){
TreeNode tempNode = stack1.peek();
singlePath.add(tempNode.val);
//将它的子树结点保存到stack2,从左往右
if(tempNode.left!=null){
stack2.push(tempNode.left);
}
if(tempNode.right!=null){
stack2.push(tempNode.right);
}
//将stack1中的节点抛出
stack1.pop();
}
//先将一层的数据存入result中
if(!singlePath.isEmpty()){
result.add(singlePath);
singlePath = new ArrayList<>();
}
//开始偶数行的数据
while(!stack2.isEmpty()){
TreeNode tempNode = stack2.peek();
singlePath.add(tempNode.val);
//将第二层的下一层子树结点加入到stack1中(奇数层加入进去)
if(tempNode.right!=null){
stack1.push(tempNode.right);
}
if(tempNode.left!=null){
stack1.push(tempNode.left);
}
stack2.pop();
}
if(!singlePath.isEmpty()){
result.add(singlePath);
singlePath = new ArrayList<>();
}
}
return result;
}
}