请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
解题思路:这道题的重点在于怎么记录每一层的节点。所以我们可以选择两个栈,第一个栈打印当前节点,第二个栈记录下一层的节点。待本层节点全部打印完之后也就是第一个栈为空时,把记录下一层节点的栈赋给当前栈,记录下一层的栈清空。重新记录下一层。
代码:
public ArrayList<ArrayList<Integer>> Print( TreeNode pRoot) { ArrayList<ArrayList<Integer>> list=new ArrayList<>(); if(pRoot==null) return list; //用于打印当前层 Stack<TreeNode> stack1=new Stack<>(); //用于记录下一层 Stack<TreeNode> stack2=new Stack<>(); stack1.push(pRoot); //用于记录当前处于第几层 int k=0; ArrayList<Integer> temp=new ArrayList<>(); while (!stack1.empty()){ TreeNode node=stack1.pop(); temp.add(node.val); //以下是为了实现z字型,所以用了两种压栈方式 if(k%2==0){ if(node.left!=null) stack2.push(node.left); if(node.right!=null) stack2.push(node.right); }else { if(node.right!=null) stack2.push(node.right); if(node.left!=null) stack2.push(node.left); } //stack1为空,表示当前层已经打印完了 if(stack1.empty()){ k++; //打印层指向下一层 stack1=stack2; //记录下一层的清空。 stack2=new Stack<>(); list.add(temp); temp=new ArrayList<>(); } } return list; }