题干
给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)
例如:
给定的二叉树是{3,9,20,#,#,15,7},
该二叉树层序遍历的结果是
[
[3],
[9,20],
[15,7]
]
示例1
输入:
{1,2}
返回值:
[[1],[2]]
示例2
输入:
{1,2,3,4,#,#,5}
返回值:
[[1],[2,3],[4,5]]
解题思路
- 首先判断属于广度遍历,基于
广度遍历用队列,深度遍历用堆栈
的套路,大概确定整体数据结构使用队列方式实现; - 难点在于需要层级输出,因此在之前广度遍历解题思路的基础上,需要想办法记录层级。
方法一:
首先想到的一个“”笨办法“”是自定义一个数据结构,除了保存树节点之外,同时保留该节点在树中的层级,队列中的元素即使用该结构,然后在广度遍历的过程中,只要层级发生变化,就重新new一个新的数组来保存本层的数据。
方法二:
利用队列大小来作为层级的标记,在原来的基础上嵌套一层循环,每一次循环输出的就是最后输出数组的一个子数组。本文示例代码即采用此思路实现。
示例代码
public class Solution {
/**
*
* @param root TreeNode类
* @return int整型ArrayList<ArrayList<>>
*/
public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
// write code here
ArrayList<ArrayList<Integer>> resultList = new ArrayList<ArrayList<Integer>>();
if(root == null) return resultList;
Queue<TreeNode> levelNodeQueue = new LinkedList<>();
levelNodeQueue.add(root);
while(!levelNodeQueue.isEmpty()){
int size = levelNodeQueue.size();
ArrayList<Integer> levelArray = new ArrayList<>();
while(size-- > 0){
TreeNode tmpNode = levelNodeQueue.poll();
levelArray.add(tmpNode.val);
if(null != tmpNode.left){
levelNodeQueue.add(tmpNode.left);
}
if(null != tmpNode.right){
levelNodeQueue.add(tmpNode.right);
}
}
if(levelArray.size()>0) {
resultList.add(levelArray);
}
}
return resultList;
}
}