题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
示例1
输入
{8,6,10,5,7,9,11}
返回值
[[8],[10,6],[5,7,9,11]]
解题思路
思想:对层序遍历进行改进-利用队列先进先出和栈先进后出的特点
由于下一层需要换顺序,所以应该是上一层后进队的左右子树在该层先进队(这里不同于层序遍历)
步骤如下:
1.根节点入队
2.队非空,取队长度,层数加一
3.节点出队遍历,之后将节点入栈
4.栈非空,节点出栈,根据奇偶层确定左右子树的入队顺序
5.直至便利完成
注意:不能把取队列长度写在循环里,不然循环时长度会更新
Java代码
import java.util.*;
/*
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) {
int count=0;
ArrayList<ArrayList<Integer>> ans=new ArrayList<>();
if(pRoot== null) return ans;
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(pRoot);//入队
while(!queue.isEmpty()){
ArrayList<Integer> list=new ArrayList<>();
int n=queue.size();//确定本层结点数
Stack<TreeNode> stack=new Stack<>();
count++;//记录层数
for(int i=0;i<n;i++){
TreeNode node1=queue.poll();//出队
list.add(node1.val);
stack.push(node1);//入栈
}
while(!stack.empty()){
TreeNode node=stack.pop();//出栈
if(count%2==0){//根据奇偶层,确定入队顺序
if(node.left != null ) queue.offer(node.left);
if(node.right != null ) queue.offer(node.right);
}
else{
if(node.right != null ) queue.offer(node.right);
if(node.left != null ) queue.offer(node.left);
}
}
ans.add(list);
}
return ans;
}
}
京公网安备 11010502036488号