剑指Offer面试题61:按之子型打印二叉树 Java实现
2016-10-16 22:57
501 查看
题目:按之字型打印二叉树
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,即第一行按照从左到右的顺序打印,第二层按照从右到左顺序打印,第三行再按照从左到右的顺序打印,其他以此类推。例如,按之字型打印下图的二叉树结果为:
1
3 2
4 5 6 7
15 14 13 12 11 10 9 8
算法分析:
按之字形顺序打印二叉树需要两个栈。我们在打印某一行结点时,把下一层的子结点保存到相应的栈里。如果当前打印的是奇数层,则先保存左子结点再保存右子结点到一个栈里;如果当前打印的是偶数层,则先保存右子结点再保存左子结点到第二个栈里。
算法源程序
以下程序转自博客:http://blog.csdn.net/derrantcm/article/details/46857935
程序运行结果:
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,即第一行按照从左到右的顺序打印,第二层按照从右到左顺序打印,第三行再按照从左到右的顺序打印,其他以此类推。例如,按之字型打印下图的二叉树结果为:
1
3 2
4 5 6 7
15 14 13 12 11 10 9 8
算法分析:
按之字形顺序打印二叉树需要两个栈。我们在打印某一行结点时,把下一层的子结点保存到相应的栈里。如果当前打印的是奇数层,则先保存左子结点再保存右子结点到一个栈里;如果当前打印的是偶数层,则先保存右子结点再保存左子结点到第二个栈里。
算法源程序
以下程序转自博客:http://blog.csdn.net/derrantcm/article/details/46857935
/************************************************************** * Copyright (c) 2016, * All rights reserved. * 版 本 号:v1.0 * 题目描述:按之字型打印二叉树 * 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,即第一行按照从左到右的顺序打印,第二层按照从右到左顺序打印,第三行再按照从左到右的顺序打印,其他以此类推。例如,按之字型打印下图的二叉树结果为: * 1 * 3 2 * 4 5 6 7 * 15 14 13 12 11 10 9 8 * 输入描述:无 * 程序输出:按之字型打印的二叉树为: * 1 * 3 2 * 4 5 6 7 * 9 8 * 问题分析: 无 * 算法描述:按之字形顺序打印二叉树需要两个栈。我们在打印某一行结点时,把下一层的子结点保存到相应的栈里。 * 如果当前打印的是奇数层,则先保存左子结点再保存右子结点到一个栈里;如果当前打印的是偶数层,则先保存右子结点再保存左子结点到第二个栈里。 * 完成日期:2016-10-16 ***************************************************************/ package org.marsguo.offerproject61; import java.util.LinkedList; import java.util.List; class TreeNode{ int val; TreeNode left = null; TreeNode right = null; public TreeNode(int val){ this.val = val; } public String toString(){ return + val + ""; } } class SolutionMethod1{ public void PrintFunction(TreeNode root){ if(root == null) return ; List<TreeNode> list1 = new LinkedList<>(); List<TreeNode> list2 = new LinkedList<>(); TreeNode node; int line = 0; list1.add(root); //把根节点放入root中 while(list1.size() > 0 ){ node = list1.remove(list1.size() - 1); System.out.printf("%-3d",node.val); if(line == 0){ if(node.left != null){ list2.add(node.left); } if(node.right != null){ list2.add(node.right); } } else{ if(node.right != null){ list2.add(node.right); } if(node.left != null){ list2.add(node.left); } } if(list1.size() == 0){ line = 1-line; List<TreeNode> tmp = list1; list1 = list2; //node每次打印都是list1,所以需要调换list1和list2并分别输出 list2 = tmp; System.out.println(); } } } } public class PrintZBinaryTree { public static void main(String[] args){ SolutionMethod1 solution1 = new SolutionMethod1(); TreeNode n1 = new TreeNode(1); TreeNode n2 = new TreeNode(2); TreeNode n3 = new TreeNode(3); TreeNode n4 = new TreeNode(4); TreeNode n5 = new TreeNode(5); TreeNode n6 = new TreeNode(6); TreeNode n7 = new TreeNode(7); TreeNode n8 = new TreeNode(8); TreeNode n9 = new TreeNode(9); n1.left = n2; n1.right = n3; n2.left = n4; n2.right = n5; n3.left = n6; n3.right = n7; n4.left = n8; n4.right = n9; System.out.println("按之字型打印的二叉树为:"); solution1.PrintFunction(n1); } }
程序运行结果:
相关文章推荐
- 剑指offer面试题61 按之字形顺序打印二叉树(java实现)
- 剑指offer面试题60 把二叉树打印成多行(Java实现)
- 剑指offer--面试题23:从上往下打印二叉树--Java实现
- 剑指Offer面试题60:把二叉树打印成多行 Java实现
- 剑指Offer 面试题32:从上到下打印二叉树 Java代码实现
- 剑指offer面试题59 对称的二叉树(java实现)
- 剑指offer----从上到下打印二叉树----java实现
- 剑指Offer:面试题25——二叉树中和为某一值的路径(java实现)
- 剑指Offer面试题23(Java版):从上往下打印二叉树
- 剑指offer刷题之java实现的从上往下打印二叉树
- 剑指offer----把二叉树打印成多行----java实现
- 剑指offer编程题Java实现——面试题12打印1到最大的n位数
- 剑指Offer面试题20:顺时针打印矩阵 Java实现
- 剑指offer|面试题6:重建二叉树(Java实现)
- 剑指offer--面试题20:顺时针打印矩阵--Java实现
- 剑指offer面试题6:重建二叉树(Java实现)
- 剑指Offer面试题6:重建二叉树 Java实现
- 剑指offer--面试题61:按之字形顺序打印二叉树
- 剑指offer--面试题25:二叉树中和为某一值的路径--Java实现
- 剑指Offer面试题59:对称二叉树 Java实现