题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
示例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; } }