题目描述
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[20,9],
[15,7]
]
提示:
节点总数 <= 1000
方法
层次遍历+逆序
思路
先使用层次遍历的方法,将每一层的值打印出来。然后将偶数行的内容逆序,达到题目要求。
代码
public List<List<Integer>> levelOrder(TreeNode root) {
// 1.层次遍历打印二叉树
List<List<Integer>> lines = new ArrayList<>();
List<Integer> line;
if(root == null)
return lines;
Queue<TreeNode> queue = new LinkedList<>(), tmp;
queue.add(root);
while(queue.size()>0){
tmp = new LinkedList<>();
line = new ArrayList<>();
for(var q : queue){
if(q.left!=null) tmp.add(q.left);
if(q.right!=null) tmp.add(q.right);
line.add(q.val);
}
lines.add(line);
queue = tmp;
}
// 2.将偶数行的内容逆序
for(int i=0; i<lines.size(); i++){
if(i%2!=0){
reverse(lines.get(i));
}
}
return lines;
}
public void reverse(List<Integer> lst){
Stack<Integer> stack = new Stack<>();
for(var l : lst){
stack.push(l);
}
lst.clear();
while(!stack.empty()){
lst.add(stack.pop());
}
}
改进:层次遍历+双端队列
思路
在层次遍历的基础上,使用双端队列来实现正序、逆序。在奇数行时,从双端队列的尾部添加元素;在偶数行时,从双端队列的头部添加元素。
java代码
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> lines = new ArrayList<>();
List<Integer> line;
Deque<Integer> line_deque;
if(root == null)
return lines;
Queue<TreeNode> queue = new LinkedList<>(), tmp;
queue.add(root);
int line_num = 1;
while(queue.size()>0){
tmp = new LinkedList<>();
line_deque = new LinkedList<Integer>();
line = new ArrayList<>();
for(var q : queue){
if(q.left!=null) tmp.add(q.left);
if(q.right!=null) tmp.add(q.right);
if(line_num%2!=0){
line_deque.addLast(q.val);
}else{
line_deque.addFirst(q.val);
}
}
for(var l : line_deque){
line.add(l);
}
lines.add(line);
queue = tmp;
line_num++;
}
return lines;
}