题目:
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
方法一:
思路:
此题是从上往下打印二叉树 II 的升级版,不仅有分层的问题,还需要解决按“之”字返回的问题。
分层:
- 每一层在弹出队列nodes中 本层的最后一个节点时,此时队列nodes中装的正好就是下一层的所有节点!
所以使用for循环,nodes的size() 即当前层的节点数量。
而“之”字遍历,依然使用BFS广度优先遍历的方法,不过此题使用了一个双端队列list,并使用一个布尔类型的遍历isOrder 来通过奇偶性变化来达到“之”字遍历的效果:
- 当isOrder为奇数时,应从左往右遍历节点,即对双端队列list使用尾插法offerLast()
- 当isOrder为偶数时,应从右往左遍历节点,即对双端队列list使用头插法offerFirst()
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> res=new ArrayList<>();
Queue<TreeNode> nodes=new LinkedList<>();
if(pRoot==null){ // 安全校验
return res;
}
nodes.add(pRoot); // 先加入头节点
boolean isOrder=true; //标记奇偶
while(!nodes.isEmpty()){
Deque<Integer> list=new LinkedList(); // 每一层新建一个双端队列
int size=nodes.size(); // 记录当前层的节点个数
for(int i=0;i<size;i++){ // nodes.size() 可能会变化,先记录下size防止出错!
//每一层在弹出队列nodes中的本层最后一个节点时,此时队列nodes中装的正好就是下一层的所有节点!
TreeNode n=nodes.poll(); // 记录每次弹出
if(isOrder){ //如果是奇数,尾插
list.offerLast(n.val);
}else{ //如果是偶数,头插
list.offerFirst(n.val);
}
// 节点添加到nodes的顺序是正常的
if(n.left!=null){
nodes.add(n.left);
}
if(n.right!=null){
nodes.add(n.right);
}
}
isOrder=!isOrder; // 奇偶变换
res.add(new ArrayList<Integer>(list) ); //Deque 转化为ArrayList
}
return res;
}
}
方法二:
“之”字遍历,建立普通ArrayList,奇数时add节点数据,
而偶数时,使用Collections.reverse() 方法来实现节点的反转,其他与方法一一致。
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> res=new ArrayList<>();
Queue<TreeNode> nodes=new LinkedList<>();
if(pRoot==null){ // 安全校验
return res;
}
nodes.add(pRoot); // 先加入头节点
boolean isOrder=true; //标记奇偶
while(!nodes.isEmpty()){
ArrayList<Integer> list=new ArrayList<>();
int size=nodes.size(); // 记录当前层的节点个数
for(int i=0;i<size;i++){ // nodes.size() 可能会变化,先记录下size防止出错!
//每一层在弹出队列nodes中的本层最后一个节点时,此时队列nodes中装的正好就是下一层的所有节点!
TreeNode n=nodes.poll(); // 记录每次弹出
list.add(n.val);
// 节点添加到nodes的顺序是正常的
if(n.left!=null){
nodes.add(n.left);
}
if(n.right!=null){
nodes.add(n.right);
}
}
if(!isOrder){ //偶数则反转ArrayList
Collections.reverse(list);
}
res.add(list);
isOrder=!isOrder; // 奇偶变换
}
return res;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/89331.html