面试题61:按之字型顺序打印二叉树

来源:互联网 发布:淘宝cpu散片哪家靠谱 编辑:程序博客网 时间:2024/06/07 17:59

import java.util.ArrayList;import java.util.Stack;/*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) {        ArrayList<ArrayList<Integer>> aList=new ArrayList<ArrayList<Integer>>();           if(pRoot==null)               return aList;                        Stack<TreeNode> s1=new Stack<TreeNode>();           s1.add(pRoot);           Stack<TreeNode> s2=new Stack<TreeNode>();           while(!s1.isEmpty()||!s2.isEmpty()){               if(!s1.isEmpty()){                   ArrayList<Integer> aList2=new ArrayList<Integer>();               while(!s1.isEmpty()){                   TreeNode p=s1.pop();                   aList2.add(p.val);                   if(p.left!=null)                       s2.add(p.left);                   if(p.right!=null)                       s2.add(p.right);               }               aList.add(aList2);                                }               else {                   ArrayList<Integer> aList2=new ArrayList<Integer>();                   while(!s2.isEmpty()){                                       TreeNode p=s2.pop();                   if(p.right!=null)                       s1.add(p.right);                   if(p.left!=null)                       s1.add(p.left);                   aList2.add(p.val);                                    }               aList.add(aList2);               }           }           return aList;    } }



/*按层序遍历分层打印的代码,添加一段判断用以倒序输出即可*/

    public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();        if(pRoot == null){            return result;        }        boolean leftToRight = true;        Queue<TreeNode> layer = new LinkedList<TreeNode>();        ArrayList<Integer> layerList = new ArrayList<Integer>();        layer.add(pRoot);        int start = 0, end = 1;        while(!layer.isEmpty()){            TreeNode cur = layer.remove();            layerList.add(cur.val);            start++;            if(cur.left!=null){                layer.add(cur.left);                       }            if(cur.right!=null){                layer.add(cur.right);            }            if(start == end){                end = layer.size();                start = 0;                              if(!leftToRight){                    result.add(reverse(layerList));                }else{                    result.add(layerList);                }                leftToRight = !leftToRight;                layerList = new ArrayList<Integer>();            }        }        return result;    }    private ArrayList reverse(ArrayList<Integer> layerList) {             int length = layerList.size();        ArrayList<Integer> reverseList = new ArrayList<Integer>();        for(int i = length-1; i >= 0;i--){            reverseList.add(layerList.get(i));        }        return reverseList;    }



/** * 大家的实现很多都是将每层的数据存进ArrayList中,偶数层时进行reverse操作, * 在海量数据时,这样效率太低了。 * (我有一次面试,算法考的就是之字形打印二叉树,用了reverse, * 直接被鄙视了,面试官说海量数据时效率根本就不行。) *  * 下面的实现:不必将每层的数据存进ArrayList中,偶数层时进行reverse操作,直接按打印顺序存入 * 思路:利用Java中的LinkedList的底层实现是双向链表的特点。 *     1)可用做队列,实现树的层次遍历 *     2)可双向遍历,奇数层时从前向后遍历,偶数层时从后向前遍历 */public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {    ArrayList<ArrayList<Integer>> ret = new ArrayList<>();    if (pRoot == null) {        return ret;    }    ArrayList<Integer> list = new ArrayList<>();    LinkedList<TreeNode> queue = new LinkedList<>();    queue.addLast(null);//层分隔符    queue.addLast(pRoot);    boolean leftToRight = true;         while (queue.size() != 1) {        TreeNode node = queue.removeFirst();        if (node == null) {//到达层分隔符            Iterator<TreeNode> iter = null;            if (leftToRight) {                iter = queue.iterator();//从前往后遍历            } else {                iter = queue.descendingIterator();//从后往前遍历             }            leftToRight = !leftToRight;            while (iter.hasNext()) {                TreeNode temp = (TreeNode)iter.next();                list.add(temp.val);            }            ret.add(new ArrayList<Integer>(list));            list.clear();            queue.addLast(null);//添加层分隔符            continue;//一定要continue        }        if (node.left != null) {            queue.addLast(node.left);        }        if (node.right != null) {            queue.addLast(node.right);        }    }         return ret;}


阅读全文
0 0
原创粉丝点击