102. 二叉树的层序遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回其层序遍历结果:
[
[3],
[9,20],
[15,7]
]
思路
可以用过队列和递归两种方法实现
解法
1. 队列BFS
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if(root == null){
return result;
}
Deque<TreeNode> deque = new LinkedList<>();
deque.offer(root);
while (!deque.isEmpty()) {
//获取当前层节点数量
int len = deque.size();
List<Integer> list = new ArrayList<>();
//将该层数据放入result
while (len > 0 && !deque.isEmpty()) {
root = deque.poll();
list.add(root.val);
if (root.left != null) {
deque.offer(root.left);
}
if (root.right != null) {
deque.offer(root.right);
}
len--;
}
result.add(list);
}
return result;
}
}
2. 递归DFS
class Solution {
List<List<Integer>> resList = new ArrayList<>();
public List<List<Integer>> levelOrder(TreeNode root) {
getNode(root, 0);
return resList;
}
public static void getNode(TreeNode root, int level) {
if (root == null) {
return;
}
level++;
if(resList.size() < level){
//当层级增加时,list的item也增加,利用list的索引值进行层级界定
List<Integer> item = new ArrayList<>();
resList.add(item);
}
resList.get(level - 1).add(root.val);
getNode(root.left, level);
getNode(root.right, level);
}
}
3. 迭代DFS
使用两个栈,一个栈维护节点数据,一个栈维护节点所在深度。把相同深度的节点放入同一个list中即可。
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> resList = new ArrayList<>();
if (root == null) {
return resList;
}
int curDepth = 0;
//存放节点
Stack<TreeNode> dataStack = new Stack<>();
//存放节点对应深度
Stack<Integer> depthStack = new Stack<>();
dataStack.push(root);
depthStack.push(0);
while (!dataStack.isEmpty()) {
root = dataStack.pop();
curDepth = depthStack.pop();
curDepth++;
if (curDepth > resList.size()) {
resList.add(new ArrayList<>());
}
resList.get(curDepth - 1).add(root.val);
if (root.right != null) {
dataStack.push(root.right);
depthStack.push(curDepth);
}
if (root.left != null) {
dataStack.push(root.left);
depthStack.push(curDepth);
}
}
return resList;
}
}