题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
代码一
思想:利用两个栈来分别存取交替层,每一层的遍历方向交替改变,每个栈只存放一层的节点,只有遍历完该栈后才存放对应交替层的节点
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {ArrayList<ArrayList<Integer>> arr = new ArrayList<ArrayList<Integer>>();if(pRoot==null)return arr;boolean flag = true;//因为每一层遍历方向都是交替的所以设置标注位Stack<TreeNode> s1 = new Stack<TreeNode>();//交替层s1.push(pRoot);Stack<TreeNode> s2 = new Stack<TreeNode>();//交替层while(!s1.isEmpty()||!s2.isEmpty()) {if(flag) {ArrayList<Integer> arrRow = new ArrayList<Integer>();while(!s1.isEmpty()) {TreeNode node = s1.pop();arrRow.add(node.val);if(node.left!=null)s2.push(node.left);if(node.right!=null)s2.push(node.right);}if(!arrRow.isEmpty()) {arr.add(arrRow);flag=false;}}else {ArrayList<Integer> arrRow = new ArrayList<Integer>();while(!s2.isEmpty()) {TreeNode node = s2.pop();arrRow.add(node.val);if(node.right!=null)s1.push(node.right);if(node.left!=null)s1.push(node.left);}if(!arrRow.isEmpty()) {arr.add(arrRow);flag=true;}}}return arr;
代码二
思想:该方法相对于代码一的精髓是在list.add(0, node.val);,它很好的处理了在每一层遍历方向的问题,而代码的遍历方向的处理是通过对节点加入栈的来改变方向,代码二是通过插入list来改变方向
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {ArrayList<ArrayList<Integer>> arr = new ArrayList<ArrayList<Integer>>();if(pRoot==null)return arr;Queue<TreeNode> q = new LinkedList<TreeNode>();q.add(pRoot);boolean flag=true;while(!q.isEmpty()) {int size = q.size();ArrayList<Integer> list = new ArrayList<Integer>();for(int i=0;i<size;i++) {TreeNode node = q.poll();if(node==null)continue;if(flag) {list.add(node.val);}else {list.add(0, node.val);}q.add(node.left);q.add(node.right);}if(!list.isEmpty()) {arr.add(list);flag = !flag;}}return arr;}
