目录
二叉树的之字形层序遍历
描述
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替),
例如:给定的二叉树是{3,9,20,#,#,15,7},
该二叉树之字形层序遍历的结果是:
[
[3],
[20,9],
[15,7]
]
示例1
输入
{1,#,2}
返回值
[[1],[2]]
备注
二叉树的数据结构为:
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
}
方法一:递归
递归将每一层的信息添加到对应层的列表中,
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer>> zigzagLevelOrder (TreeNode root) {
// write code here
ArrayList<ArrayList<Integer>> arrayLists=new ArrayList<>();
return levelTraversal(root,0,arrayLists);
}
public ArrayList<ArrayList<Integer>> levelTraversal (TreeNode root,int level,ArrayList<ArrayList<Integer>> arrayLists) {
// write code here
if(root==null){
return arrayLists;
}
ArrayList<Integer> arr;
try{
arr=arrayLists.get(level);
}catch (Exception e) {
arr = new ArrayList<>();//在第一次遍历到当前层时新建列表
arrayLists.add(arr);//将列表添加到当前层队列
}
if(level%2==0) {
arr.add(root.val);//向后插入
}else{
arr.add(0,root.val);//向前插入
}
arrayLists.set(level,arr);
arrayLists=levelTraversal(root.left,level+1,arrayLists);
arrayLists=levelTraversal(root.right,level+1,arrayLists);
return arrayLists;
}
}
因为第一次访问新层时列表中没有元素,所以这里用异常进行捕获处理,时间消耗还行
方法二:队列
逐层遍历每个节点,将子树添加到下层节点中,
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer>> zigzagLevelOrder (TreeNode root) {
// write code here
ArrayList<ArrayList<Integer>> arrayLists=new ArrayList<>();
Queue<TreeNode> nodes=new LinkedList<>();
if(root!=null){
nodes.add(root);
}
int level=0;
while(!nodes.isEmpty()){
int curLevelNum=nodes.size();//当前层数节点的个数
ArrayList<Integer> temp=new ArrayList<>();
for (int i = 0; i < curLevelNum; i++) {//遍历当前层的所有节点
TreeNode node=nodes.poll();
if(level%2==0){
temp.add(node.val);//从后插入
}else{
temp.add(0,node.val);//从前插入
}
if(node.left!=null){
nodes.add(node.left);//左子树不为空添加到下一层节点中
}
if(node.right!=null){
nodes.add(node.right);//右子树不为空添加到下一层节点中
}
}
arrayLists.add(temp);
level++;
}
return arrayLists;
}
}