题目:请实现一个函数按照之字形顺序打印二叉树,即第一层按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三层再按照从左到右的顺序打印,其他行以此类推。
使用两个栈(后入先出)来实现。
import java.util.ArrayList;
import java.util.*;
/*
public class TreeNode//节点类
{
int val = 0;//根节点的值
TreeNode left = null;//左子节点
TreeNode right = null;//右子节点
public TreeNode(int val)
{
this.val = val;
}
}
*/
public class Solution
{
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot)
{
ArrayList<ArrayList<Integer>> listAll = new ArrayList<ArrayList<Integer>>();
if(pRoot == null)
return listAll;
//定义2个栈
Stack<TreeNode> stack1 = new Stack<TreeNode>();//存储当前层的节点
Stack<TreeNode> stack2 = new Stack<TreeNode>();//存储下一层的节点
Stack<TreeNode> stack_tmp = new Stack<TreeNode>();//暂存变量
int direction = 0;//指示方向(当前层为奇数层:先保存左子节点后保存右子节点;当前层为偶数层:先保存右子节点后保存左子节点)
stack1.push(pRoot);//将指定项压入栈中
TreeNode curNode = null;
ArrayList<Integer> list = new ArrayList<Integer>();
while(!stack1.empty())
{
curNode = stack1.pop();//查找并移除堆栈顶部的元素
System.out.print(curNode.val + " ");
list.add(curNode.val);
if(direction == 0)//表示当前层是奇数层,打印当前层的节点时,要先保存左子节点后保存右子节点
{
if(curNode.left != null)
stack2.push(curNode.left);
if(curNode.right != null)
stack2.push(curNode.right);
}
else//current == 1时//表示当前层是偶数层,打印当前层的节点时,要先保存右子节点后保存左子节点
{
if(curNode.right != null)
stack2.push(curNode.right);
if(curNode.left != null)
stack2.push(curNode.left);
}
if(stack1.empty())//表示当前层的节点已经打印完毕
{
System.out.println();//换行
listAll.add(list);
list = new ArrayList<Integer>();
stack_tmp = stack2;
stack2 = stack1;
stack1 = stack_tmp;
direction = 1 - direction;
}
}
return listAll;
}
}