题目描述:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
解题思路:
在Java中可以利用LinkedList作为双端队列使用(addFirst(x)、addLast(x))。在Java/C++中将奇偶分类讨论。
方法一:双端队列(Java)
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> contain = new ArrayList<>();
if(root == null) return contain;
LinkedList<TreeNode> que = new LinkedList<>();
que.offer(root);
int next = 1;
while(!que.isEmpty()){
LinkedList<Integer> value = new LinkedList<>();
int size = que.size();
for(int i = 0; i < size;i++){
TreeNode node = que.poll();
if(next % 2 == 0) value.addFirst(node.val);
else value.addLast(node.val);
if(node.left != null) que.add(node.left);
if(node.right != null) que.add(node.right);
}
contain.add(value);
next++;
}
return contain;
}
}
方法二:奇偶讨论(C++)
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> contain;
if(!root) return contain;
queue<TreeNode*> que;
que.push(root);
int next = 1;
while(!que.empty()){
int size = que.size();
vector<int> value;
for(int i = 0;i < size;i++){
TreeNode* node = que.front();
value.push_back(node -> val);
if(node -> left) que.push(node -> left);
if(node -> right) que.push(node -> right);
que.pop();
}
if(next % 2 == 0) reverse(value.begin(), value.end());
contain.push_back(value);
next++;
}
return contain;
}
};
2022-Java
解题思路:
(1)分奇偶,借助辅助栈
(2)将每一层的元素压入栈后,依次弹出给到当前层的队列
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if(root == null) return result;
// 当前层队列
LinkedList<TreeNode> queue = new LinkedList<>();
// 辅助栈
LinkedList<TreeNode> stack = new LinkedList<>();
queue.addLast(root);
// 当前层打印
ArrayList<Integer> tmp_list = new ArrayList<>();
int i = 1;
while(queue.size() != 0){
TreeNode node = queue.removeFirst();
tmp_list.add(node.val);
// 从左到右压入栈
if(i % 2 == 1){
if(node.left != null){
stack.addLast(node.left);
}
if(node.right != null){
stack.addLast(node.right);
}
}else{
// 从右到左压入栈
if(node.right != null){
stack.addLast(node.right);
}
if(node.left != null){
stack.addLast(node.left);
}
}
// 完成当前层
if(queue.size() == 0){
// 当前层 已全部压入栈
while(!stack.isEmpty()){
TreeNode cur_node = stack.removeLast();
queue.addLast(cur_node);
}
result.add(tmp_list);
tmp_list = new ArrayList();
i++;
}
}
return result;
}
}