题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
解题思路
借用两个栈,分别保存奇数层和偶数层节点。
每当从左到右输出奇数层的时候,顺便将奇数层的子节点按照从左到右存在偶数栈中,这样下一层的偶数层节点从栈中输出的顺序便可以按照从右到左了。
对于偶数层也是按照这种方法,输出的时候将接下来的奇数层从右到左放入奇数栈中。
代码
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer> > list = new ArrayList<>();
if(pRoot == null)
return list;
Stack<TreeNode> odd = new Stack<TreeNode>();
Stack<TreeNode> even = new Stack<TreeNode>();
odd.add(pRoot);
while(!odd.empty() || !even.empty()){
ArrayList<Integer> tem = new ArrayList<Integer>();
if(!odd.empty()){
while(!odd.empty()){
TreeNode temp = odd.pop();
tem.add(temp.val);
if(temp.left != null)
even.push(temp.left);
if(temp.right != null)
even.push(temp.right);
}
}else if(!even.empty()){
while(!even.empty()){
TreeNode temp = even.pop();
tem.add(temp.val);
if(temp.right != null)
odd.push(temp.right);
if(temp.left != null)
odd.push(temp.left);
}
}
list.add(tem);
}
return list;
}
注:题目来自剑指offer,代码可以直接提交至牛客网站运行,欢迎批评指正。