【剑指offer】面试题32(3):之字形打印二叉树
来源:互联网 发布:photoshop cs软件下载 编辑:程序博客网 时间:2024/06/05 15:33
完整代码地址
完整代码地址
题目
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
思路
刚看到这个题目的时候,感觉很简单,还是用之前的做法,用队列来实现,然后用一个辅助栈,来对偶数行的进行压栈并出栈放到队列中。但是这个做法并不是最好的,代码实现起来较为复杂
更好的做法:
使用两个栈来解决这个问题。我们在打印某一层的节点时,把下一层的子节点保存到相应的栈里。
如果当前打印的是奇数层(第一层、第三层等),则先保存左子节点再保存右子节点到第一个栈里。
如果当前打印的是偶数层(第二层、第四层等),则先保存右子节点再保存左子节点到第二个栈里。
例如:
完全二叉树
1
2 3
4 5 6 7
8 9 10 11 12 13 14 15
首先将1保存在第一个栈stack1里,
然后对stack1进行依次出栈,并将出栈的节点的左子节点和右子节点依次入第二个栈stack2。即2和3依次进入stack2。
然后对stack2进行依次出栈,并将出栈的节点的右子节点和左子节点依次入第一个栈stack1。即7,6,5,4依次进入stack1。
然后对stack1进行依次出栈,并将出栈的节点的左子节点和右子节点依次入第二个栈stack2。即8,9,10,11,12,13,14,15依次进入stack2。
然后对stack2进行依次出栈,因为子节点为null,所以没有再进栈。遍历结束。
代码
/** * 请实现一个函数按照之字形打印二叉树, * 即第一行按照从左到右的顺序打印, * 第二层按照从右至左的顺序打印, * 第三行按照从左到右的顺序打印,其他行以此类推。 * * @author peige */public class _32_03_PrintTreesInZigzag { public static class TreeNode { public int val = 0; public TreeNode left = null; public TreeNode right = null; public TreeNode(int val) { this.val = val; } } public static ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { if(pRoot == null) return new ArrayList<>(); ArrayList<ArrayList<Integer>> result = new ArrayList<>(); ArrayList<Integer> lineResult = new ArrayList<>(); LinkedList<TreeNode> oddLineStack = new LinkedList<>(); // 奇数行 LinkedList<TreeNode> evenLineStack = new LinkedList<>(); // 偶数行 boolean isOddLineNow = true; // 正在遍历的是奇数行还是偶数行 oddLineStack.addFirst(pRoot); while(!oddLineStack.isEmpty() || !evenLineStack.isEmpty()) { if(isOddLineNow) { while(!oddLineStack.isEmpty()) { TreeNode node = oddLineStack.removeFirst(); lineResult.add(node.val); if(node.left != null) evenLineStack.addFirst(node.left); if(node.right != null) evenLineStack.addFirst(node.right); } isOddLineNow = false; result.add(lineResult); lineResult = new ArrayList<>(); } else { while(!evenLineStack.isEmpty()) { TreeNode node = evenLineStack.removeFirst(); lineResult.add(node.val); if(node.right != null) oddLineStack.addFirst(node.right); if(node.left != null) oddLineStack.addFirst(node.left); } isOddLineNow = true; result.add(lineResult); lineResult = new ArrayList<>(); } } return result; }}
测试
public class _32_03_Test { public static void main(String[] args) { test1(); test2(); test3(); } /** * 功能测试 * 1 * / \ * 2 3 * / \ \ * 4 5 6 */ private static void test1() { TreeNode root = new TreeNode(1); TreeNode node2 = new TreeNode(2); TreeNode node3 = new TreeNode(3); TreeNode node4 = new TreeNode(4); TreeNode node5 = new TreeNode(5); TreeNode node6 = new TreeNode(6); root.left = node2; root.right = node3; node2.left = node4; node2.right = node5; node3.right = node6; System.out.println(_32_03_PrintTreesInZigzag.Print(root)); } /** * 边界测试 * 1.只有一个节点 * 2.每个节点都只有左子节点 * 3.每个节点都只有右子节点 */ private static void test2() { TreeNode root = new TreeNode(1); System.out.println(_32_03_PrintTreesInZigzag.Print(root)); TreeNode node2 = new TreeNode(2); TreeNode node3 = new TreeNode(3); root.left = node2; node2.left = node3; System.out.println(_32_03_PrintTreesInZigzag.Print(root)); root.left = null; node2.left = null; root.right = node2; node2.right = node3; System.out.println(_32_03_PrintTreesInZigzag.Print(root)); } /** * 极端测试 * null */ private static void test3() { System.out.println(_32_03_PrintTreesInZigzag.Print(null)); }}
阅读全文
0 0
- java面试题(剑指offer):之字形打印二叉树
- 【剑指offer】面试题32(3):之字形打印二叉树
- 剑指offer面试题61 按之字形顺序打印二叉树(java实现)
- 《剑指Offer》学习笔记--面试题61:按之字形顺序打印二叉树
- 【剑指Offer学习】【面试题61:按之字形顺序打印二叉树】
- 剑指offer-面试题61:按之字形顺序打印二叉树
- 剑指offer--面试题61:按之字形顺序打印二叉树
- 剑指offer-面试题61-按之字形顺序打印二叉树
- 剑指offer 面试题61 按之字形顺序打印二叉树
- 【剑指Offer】面试题61:按之字形顺序打印二叉树
- 《剑指offer》Python语言 面试题61:按之字形顺序打印二叉树
- 剑指offer——面试题61:按之字形顺序打印二叉树
- 剑指offer----之字形打印二叉树
- 剑指offer(62):之字形打印二叉树
- 剑指offer(56)-按之字形顺序打印二叉树
- 剑指offer——之字形打印二叉树(一般)
- 【剑指offer】面试题32:从上到下打印二叉树
- 面试题61:按之字形顺序打印二叉树
- Struts2动态参数封装
- 1090. Highest Price in Supply Chain (25)<BFS,DFS>
- [Leetcode] 319. Bulb Switcher 解题报告
- Android_传感器
- WatchOS系统开发大全(6)-WKInterfaceLabel
- 【剑指offer】面试题32(3):之字形打印二叉树
- 【python】在图片加上数字
- 数组元素标记法
- Python线程同步
- 计算机设计思想 —— 分层模型
- 新闻网页类开发html和iOS原生交互
- Enterprise Architect 数据库逆向工程(导入已经存在的数据表结构)
- XStream读取XML文件
- 7-22 html-css重点学习