面试题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
- 面试题61:按之字型顺序打印二叉树
- 按之字型顺序打印二叉树
- 面试题61:按之字形顺序打印二叉树
- 面试题61:按之字形顺序打印二叉树
- 面试题61:按之字形顺序打印二叉树
- 面试题61:按之字形顺序打印二叉树
- 面试题68:按之字形顺序打印二叉树
- 面试题61. 按之字形顺序打印二叉树
- 《剑指Offer》学习笔记--面试题61:按之字形顺序打印二叉树
- 【剑指Offer学习】【面试题61:按之字形顺序打印二叉树】
- 剑指offer-面试题61:按之字形顺序打印二叉树
- 剑指offer--面试题61:按之字形顺序打印二叉树
- 剑指offer-面试题61-按之字形顺序打印二叉树
- 剑指offer 面试题61 按之字形顺序打印二叉树
- 剑指offer面试题61 按之字形顺序打印二叉树(java实现)
- 【剑指Offer】面试题61:按之字形顺序打印二叉树
- 《剑指offer》Python语言 面试题61:按之字形顺序打印二叉树
- 剑指offer——面试题61:按之字形顺序打印二叉树
- 性能测试:响应时间/并发用户数/吞吐量/思考时间的计算
- jdbcTemplate常见用法整理。
- 上线打包出现错误整理90362,90535,4238
- 使用jsencrypt实现参数的前端加密
- VirtualBox for mac调整虚拟机硬盘大小
- 面试题61:按之字型顺序打印二叉树
- thinkphp5 源码分析二 框架引导
- 通过实现Runnable接口创建线程
- C++中的static关键字的总结
- linux下tar的打包使用
- linux C/C++服务器后台开发面试题总结
- Windows 2012 下Redmine安装和环境搭建
- iOS基石——NSTimer
- 使用datepicker和uploadify的冲突解决(IE双击才能打开附件上传对话框)