/**
* 题目描述
* 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
* 示例1
* 输入
* {8,6,10,5,7,9,11}
* 返回值
* [[8],[10,6],[5,7,9,11]]
*/
两个栈来实现; 定义一个放奇数层得栈,一个方偶数层得栈,和一个层奇偶标志, 遍历两个栈,每次消灭一个栈中得数据,添加在list中添加一层得数据 需要注意得是结合栈得先进后出性质,当我们遍历到奇数层时候,我们要从左到右得添加数据到栈二.同理偶数相反.
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> datas = new ArrayList<>();
if (pRoot == null) {
return datas;
}
//奇数行从左到右,偶数行从右到左
//奇数栈
Stack<TreeNode> oddStack = new Stack<>();
//偶数栈
Stack<TreeNode> evenStack = new Stack<>();
oddStack.add(pRoot);
//当前需要遍历的是奇数栈
boolean isOdd = true;
while (!oddStack.isEmpty() || !evenStack.isEmpty()) {
ArrayList<Integer> item = new ArrayList<>();
if (isOdd) {
while (!oddStack.isEmpty()) {
final TreeNode poll = oddStack.pop();
item.add(poll.val);
if (poll.left != null) {
evenStack.push(poll.left);
}
if (poll.right != null) {
evenStack.push(poll.right);
}
}
} else {
while (!evenStack.isEmpty()) {
while (!evenStack.isEmpty()) {
final TreeNode poll = evenStack.pop();
item.add(poll.val);
if (poll.right != null) {
oddStack.add(poll.right);
}
if (poll.left != null) {
oddStack.add(poll.left);
}
}
}
}
isOdd = !isOdd;
datas.add(item);
}
return datas;
}