老实人解法
按之字形顺序打印二叉树
http://www.nowcoder.com/questionTerminal/91b69814117f4e8097390d107d2efbe0
分析题目可以知道,奇数行总是从左到右,偶数行总是从右到左
初步想法就是bfs!
如何从右边到左遍历的同时能够使下一行能够从左到右遍历呢?
可以用栈, 依次从右到左 放子树 放左 右
使用栈存储下一行数据(奇数行总是从左到右,偶数行总是从右到左)
奇数行:扫描当前行存入ArrayList,依次放入每个结点的 左 右 左 右,下一行(偶数行) 栈出栈就是 右 左 右 左
偶数行:扫描当前行存入ArrayList,依次放入每个结点的 右 左 右 左,下一行(奇数行) 栈出栈就是 左 右 左 右
每遍历完成一行存入result
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
if (pRoot == null) {
return result;
}
Stack<TreeNode> stack = new Stack<>();
// 使用一个flag来标记是奇数行还是偶数行 奇数行为true,偶数行为false
boolean flag = true;
stack.push(pRoot);
while (stack.size() != 0) {
ArrayList<Integer> curList = new ArrayList<>();
ArrayList<TreeNode> curLine = new ArrayList<>();
while (stack.size() != 0) {
curLine.add(stack.pop());
}
if (flag) {
for (TreeNode node : curLine) {
curList.add(node.val);
// 奇数行下一行,先放左后放右
if (node.left != null) {
stack.push(node.left);
}
if (node.right != null) {
stack.push(node.right);
}
}
} else {
for (TreeNode node : curLine) {
curList.add(node.val);
// 偶数行下一行,先放右后放左
if (node.right != null) {
stack.push(node.right);
}
if (node.left != null) {
stack.push(node.left);
}
}
}
result.add(curList);
flag = !flag;
}
return result;
}
查看18道真题和解析