树的层序遍历可以使用队列实现,队列的思想是一头进,一头出,而如果ArrayList同样能实现队列,但是ArrayList增删需要移动大量元素,会比较耗时,因此使用linkedlist会更加高效。
主要问题:题目要求返回的是一个ArrayList<ArrayList<integer>>对象,也就是一层的节点数据存在一个ArrayList<integer>中,因此需要记录每一层的节点个数,并将这些节点保存在一个ArrayList<integer>中
主要思路:</integer></integer></integer>
- 设置变量: int count=1;int pre=count;
- 每从队头获取一个元素,pre--;count--;
- 每添加一个节点到队列中,count++,每(访问)删除一个节点count--
- 如果pre==0设置pre=count,
设置pre的目的也就是确定一层节点的边界
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 ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
// write code here
ArrayList<ArrayList<Integer>> retArray=new ArrayList<ArrayList<Integer>>();
LinkedList<TreeNode> list=new LinkedList<>();
if(root!=null) list.add(root);
int count=1;
int pre=count;
ArrayList<Integer> levelArray=new ArrayList<Integer>();
while(list.size()>0){
TreeNode temp=list.remove(0);
// 添加数据到一层的列表中
levelArray.add(temp.val);
// sout(temp.val)
//
pre--;
count--;
if(temp.left!=null){
list.addLast(temp.left);
count++;
}
if(temp.right!=null){
list.addLast(temp.right);
count++;;
}
//保存一层的节点数,
if(pre==0) {
pre=count;
retArray.add(levelArray);
if(list.size()>0)
levelArray=new ArrayList<Integer>();
}
}
return retArray;
}
}
京公网安备 11010502036488号