请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
定义一个放奇数层得栈,一个方偶数层得栈,和一个层奇偶标志, 遍历两个栈,每次消灭一个栈中得数据,添加在list中添加一层得数据 需要注意得是结合栈得先进后出性质,当我们遍历到奇数层时候,我们要从左到右得添加数据到栈二.同理偶数相反.
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> datas=new ArrayList<>();
if (pRoot==null){
return datas;
}
Stack<TreeNode> stack1=new Stack<>(); //存放奇数层结点
stack1.push(pRoot);
Stack<TreeNode> stack2=new Stack<>();//存放偶数层结点
boolean leftToRight=true;//奇数层--从左到右
while (!stack1.isEmpty()||!stack2.isEmpty()){ //只要树没有遍历完
ArrayList<Integer> data=new ArrayList<>();
if (leftToRight==true){ //如果是奇数层
//将结点从左到右加入偶数栈
while (!stack1.isEmpty())
{
TreeNode node = stack1.pop(); //取队栈顶元素
if (node.left!=null){
stack2.push(node.left);
}
if (node.right!=null){
stack2.push(node.right);
}
data.add(node.val);
}
leftToRight = false;
}else {
while (!stack2.isEmpty())
{
TreeNode node = stack2.pop(); //取队栈顶元素
if (node.right!=null){
stack1.push(node.right);
}
if (node.left!=null){
stack1.push(node.left);
}
data.add(node.val);
}
leftToRight=true;
}
datas.add(data);
}
return datas;
}