您的位置:首页 > 职场人生

剑指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

/**************************************************************
* 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);
}
}


程序运行结果:




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息