二叉树的之字形层序遍历
描述
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
例如:
给定的二叉树是{3,9,20,#,#,15,7},
该二叉树之字形层序遍历的结果是
[
[3],
[20,9],
[15,7]
]
求解
思路
题目采用一个队列的方式进行实现,
通过对偶数层和奇数层的数值进行判断,同时对于
- 奇数层从尾部插入数组集合
- 偶数层从头部插入数组集合
- 最终把数组集合存放到res中
代码如下:
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类
* @return int整型ArrayList<ArrayList<>>
*/
public static ArrayList<ArrayList<Integer>> zigzagLevelOrder (TreeNode root) {
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
Queue<TreeNode> queen = new LinkedList<TreeNode>();//定义一个队列
// write code here
if(root != null){
queen.add(root);//入队列
}
while(!queen.isEmpty()){
ArrayList<Integer> temp = new ArrayList<Integer>();//存储每一层的节点
for(int i = queen.size(); i>0;i--){
TreeNode node = queen.poll();
//开始插入
//若是奇数层
if((res.size()+1)%2 != 0){
temp.add(node.val);
}else{
temp.add(0,node.val);//偶数层在前面
}
//开始递归
if(node.left != null){
queen.add(node.left);
}
if(node.right != null){
queen.add(node.right);
}
}
res.add(temp);//将其节点加入到res中
}
return res;
}
}
代码分析:
- 创建队列,并对节点进行加入队列
Queue<TreeNode> queen = new LinkedList<TreeNode>();//定义一个队列
// write code here
if(root != null){
queen.add(root);//入队列
}
2、设置一个集合,对当前的队列的所在层数的节点进行存储
3、通过对其进行入队列,并对每一层的节点进行遍历
4、若为奇数层,尾部插入
5、若为偶数层,则头部插入
代码:
while(!queen.isEmpty()){
ArrayList<Integer> temp = new ArrayList<Integer>();//存储每一层的节点
for(int i = queen.size(); i>0;i--){
TreeNode node = queen.poll();
//开始插入
//若是奇数层
if((res.size()+1)%2 != 0){
temp.add(node.val);
}else{
temp.add(0,node.val);//偶数层在前面
}
//开始递归
if(node.left != null){
queen.add(node.left);
}
if(node.right != null){
queen.add(node.right);
}
}
res.add(temp);//将其节点加入到res中
}
实现的方式如上