前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每天一道剑指offer-按之字形顺序打印二叉树

每天一道剑指offer-按之字形顺序打印二叉树

作者头像
乔戈里
发布2019-03-06 10:37:03
5440
发布2019-03-06 10:37:03
举报
文章被收录于专栏:Java那些事Java那些事

出处: https://www.nowcoder.com/questionTerminal/91b69814117f4e8097390d107d2efbe0

大家的实现很多都是将每层的数据存进ArrayList中,偶数层时进行reverse操作, 在海量数据时,这样效率太低了。 (我有一次面试,算法考的就是之字形打印二叉树,用了reverse, 直接被鄙视了,面试官说海量数据时效率根本就不行。) 下面的实现:不必将每层的数据存进ArrayList中,偶数层时进行reverse操作,直接按打印顺序存入 思路:利用Java中的LinkedList的底层实现是双向链表的特点。 1)可用做队列,实现树的层次遍历 2)可双向遍历,奇数层时从前向后遍历,偶数层时从后向前遍历

代码语言:javascript
复制
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;}

END

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员乔戈里 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档