JZ59 按之字形顺序打印二叉树
题目描述:
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
示例:
输入:
{8,6,10,5,7,9,11}
返回值:
[[8],[10,6],[5,7,9,11]]
题解:
方法:bfs
1.思路:
其实就是层次遍历的变形
偶数层从左向右遍历
奇数层从右向左遍历
可以两个数组,一个存奇数层有一个存偶数层。
2.复杂度:
时间复杂度:O(n*level)
空间复杂度:O(n)
3.代码:
import java.util.ArrayList;
import java.util.LinkedList;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<TreeNode> list1 = new ArrayList<>();
ArrayList<TreeNode> list2 = new ArrayList<>();
ArrayList<ArrayList<Integer> > array = new ArrayList<>();
if(pRoot==null)
return array;
list1.add(pRoot);
while(!list1.isEmpty()||!list2.isEmpty()){
if(!list1.isEmpty()){
ArrayList<Integer> list = new ArrayList<>();
int size = list1.size();
for(int i=0; i<size; i++){
list.add(list1.get(i).val);
if(list1.get(size-1-i).right!=null)
list2.add(list1.get(size-1-i).right);
if(list1.get(size-1-i).left!=null)
list2.add(list1.get(size-1-i).left);
}
array.add(list);
list1.clear();
}
if(!list2.isEmpty()){
ArrayList<Integer> list = new ArrayList<>();
int size = list2.size();
for(int i=0; i<size; i++){
list.add(list2.get(i).val);
if(list2.get(size-1-i).left!=null)
list1.add(list2.get(size-1-i).left);
if(list2.get(size-1-i).right!=null)
list1.add(list2.get(size-1-i).right);
}
array.add(list);
list2.clear();
}
}
return array;
}
}