题目描述:
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
思路解析:
- 需要两个栈来辅助输出之字形的二叉树的结点值。
- 单数栈是单数行的输出,在出栈的过程中,需要把出栈结点的左右子树放入双数栈中,先左后右,这样输出就是从后向前了
- 双数栈是双数行的输出,在出栈的过程中,需要把出栈结点的左右子树放入单数栈中,先右后左
package com.ma.twoforkedtree;
import java.util.LinkedList;
import java.util.Stack;
public class ZhiPrint {
public static void print(TreeNode root){
if(root == null){
return;
}
Stack<TreeNode> s1 = new Stack<>();//存放奇数行
Stack<TreeNode> s2 = new Stack<>();//存放偶数行
s1.push(root);
while(! s1.isEmpty()){
//弹出奇数行的元素
TreeNode node = s1.pop();
System.out.print(node.value + " ");
//判断该行是否结束
if(s1.isEmpty()){
System.out.print(" ");
}
//给s2中先左后右压入节点
if(node.left != null){
s2.push(node.left);
}
if(node.right != null){
s2.push(node.right);
}
}
while(! s2.isEmpty()){
//弹出偶数行的元素
TreeNode node = s2.pop();
System.out.print(node.value + " ");
//判断该行是否结束
if(s2.isEmpty()){
System.out.print(" ");
}
//给s1中先右后左压入节点
if(node.right != null){
s1.push(node.right);
}
if(node.left != null){
s1.push(node.left);
}
}
}
public static void main(String[] args) {
//用队列构建一个完全二叉树
LinkedList<TreeNode> q = new LinkedList<>();
int i = 1;
TreeNode root = new TreeNode(i++);
q.add(root);
while(!q.isEmpty() && i < 16){
TreeNode lchild = new TreeNode(i++);
TreeNode rchild = new TreeNode(i++);
TreeNode node = q.poll();
node.left = lchild;
node.right = rchild;
q.add(node.left);
q.add(node.right);
}
print(root);
}
}
class TreeNode{
int value;
TreeNode left;
TreeNode right;
public TreeNode(int value){
this.value = value;
}
}