题目:请实现一个函数按照之字形打印二叉树,即第一行从左到右的顺序打印,第二行按照从右到左打印,第三行再按照从左到右的顺序打印,以此类推。
基本思路:需要两个栈,我们在打印某一层的节点时,把下一层的节点保存到相应的栈中(先进后出,到时候按栈顶输出)。先保存根节点到第一个栈(存储奇数层节点),如果当前打印的是奇数层,则先保存左子节点再保存右子节点到第二个栈(存储偶数层节点);如果当前打印的是偶数层,则先保存右子节点再保存左子节点到第一个栈。
Java实现:
import java.awt.List;
import java.util.ArrayList;
import java.util.Stack;
public class PrintTreeAsZhi {
public static class BinaryTreeNode {
int value;
BinaryTreeNode left;
BinaryTreeNode right;
}
void printTreeAdZHi(BinaryTreeNode root) {
if(root==null)
return ;
ArrayList<Stack<BinaryTreeNode>>level=new ArrayList<Stack<BinaryTreeNode>>();
level.get(1).push(root);
int current=1;//1表示奇数层
int next=2;//2表示偶数层
while(!level.get(1).isEmpty()||!level.get(2).isEmpty()) {
BinaryTreeNode node=level.get(current).peek();
level.get(current).pop();
System.out.println(node.value);
if(current==1) {//如果当前打印奇数层
if(node.left!=null) {
level.get(next).push(node.left);
}
if(node.right!=null) {
level.get(next).push(node.right);
}
}else {//如果当前打印偶数层
if(node.right!=null) {
level.get(next).push(node.right);
}
if(node.left!=null) {
level.get(next).push(node.left);
}
}
//当一层打印完,交换这两个栈并继续打印下一层
if(level.get(current).isEmpty()) {
System.out.println("\n");
int temp=current;
current=next;
next=temp;
}
}
}