题目描述

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

代码一

思想:利用两个栈来分别存取交替层,每一层的遍历方向交替改变,每个栈只存放一层的节点,只有遍历完该栈后才存放对应交替层的节点

  1. public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
  2. ArrayList<ArrayList<Integer>> arr = new ArrayList<ArrayList<Integer>>();
  3. if(pRoot==null)return arr;
  4. boolean flag = true;//因为每一层遍历方向都是交替的所以设置标注位
  5. Stack<TreeNode> s1 = new Stack<TreeNode>();//交替层
  6. s1.push(pRoot);
  7. Stack<TreeNode> s2 = new Stack<TreeNode>();//交替层
  8. while(!s1.isEmpty()||!s2.isEmpty()) {
  9. if(flag) {
  10. ArrayList<Integer> arrRow = new ArrayList<Integer>();
  11. while(!s1.isEmpty()) {
  12. TreeNode node = s1.pop();
  13. arrRow.add(node.val);
  14. if(node.left!=null)s2.push(node.left);
  15. if(node.right!=null)s2.push(node.right);
  16. }
  17. if(!arrRow.isEmpty()) {
  18. arr.add(arrRow);
  19. flag=false;
  20. }
  21. }else {
  22. ArrayList<Integer> arrRow = new ArrayList<Integer>();
  23. while(!s2.isEmpty()) {
  24. TreeNode node = s2.pop();
  25. arrRow.add(node.val);
  26. if(node.right!=null)s1.push(node.right);
  27. if(node.left!=null)s1.push(node.left);
  28. }
  29. if(!arrRow.isEmpty()) {
  30. arr.add(arrRow);
  31. flag=true;
  32. }
  33. }
  34. }
  35. return arr;

代码二

思想:该方法相对于代码一的精髓是在list.add(0, node.val);,它很好的处理了在每一层遍历方向的问题,而代码的遍历方向的处理是通过对节点加入栈的来改变方向,代码二是通过插入list来改变方向

  1. public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
  2. ArrayList<ArrayList<Integer>> arr = new ArrayList<ArrayList<Integer>>();
  3. if(pRoot==null)return arr;
  4. Queue<TreeNode> q = new LinkedList<TreeNode>();
  5. q.add(pRoot);
  6. boolean flag=true;
  7. while(!q.isEmpty()) {
  8. int size = q.size();
  9. ArrayList<Integer> list = new ArrayList<Integer>();
  10. for(int i=0;i<size;i++) {
  11. TreeNode node = q.poll();
  12. if(node==null)continue;
  13. if(flag) {
  14. list.add(node.val);
  15. }else {
  16. list.add(0, node.val);
  17. }
  18. q.add(node.left);
  19. q.add(node.right);
  20. }
  21. if(!list.isEmpty()) {
  22. arr.add(list);
  23. flag = !flag;
  24. }
  25. }
  26. return arr;
  27. }