题目:按之字型打印二叉树
程序运行结果:
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,即第一行按照从左到右的顺序打印,第二层按照从右到左顺序打印,第三行再按照从左到右的顺序打印,其他以此类推。例如,按之字型打印下图的二叉树结果为:
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);
}
}