题目描述
102.二叉树的层序遍历
https://leetcode-cn.com/problems/binary-tree-level-order-traversal/
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
题解一:BFS
一看就是使用BFS,但是需要将每一层的结果单独保存,因此BFS的时候需要创建两个Queue,一个保存父级的点,一个保存子级的点。
首先遍历queue1得到父级对应的子级,然后遍历queue2得到当前点的value,添加到List中,将List添加到result中,然后将子级的点复制给父级,清空子级队列
class Solution {
//BFS
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if (root == null) {
return result;
}
//queue1是父层,queue2是从左到右的子层,通过子层赋值给父层达到一层层遍历的目的
Queue<TreeNode> queue1 = new LinkedList<TreeNode>();
Queue<TreeNode> queue2 = new LinkedList<TreeNode>();
List<Integer> temp = new ArrayList<>();
queue1.offer(root);
temp.add(root.val);
result.add(temp);
while (!queue1.isEmpty()) {
while (!queue1.isEmpty()) {
// System.out.println(temp);
root = queue1.poll();
if (!(root.left==null)) {
queue2.offer(root.left);
}
if (!(root.right==null)) {
queue2.offer(root.right);
}
}
temp = new ArrayList<>();
for(TreeNode q : queue2){
temp.add(q.val);
}
if (!temp.isEmpty()) {
result.add(temp);
}
queue1.addAll(queue2);
queue2.clear();
}
return result;
}
}
首先,自己写出来了,但是效果不太好,然后尝试着进行一下优化,嗯,发现优化之后没效果,还是看看别人的吧。。。
看一下官方的BFS代码吧,哈哈哈思路大体差不多,只是少创建了一个queue,使用了for替代了queue的作用,彼此彼此哈哈
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
Queue<TreeNode> queue = new ArrayDeque<>();
if (root != null) {
queue.add(root);
}
while (!queue.isEmpty()) {
int n = queue.size();
List<Integer> level = new ArrayList<>();
for (int i = 0; i < n; i++) {
TreeNode node = queue.poll();
level.add(node.val);
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
res.add(level);
}
return res;
}
题解二:DFS使用Map
我先使用遍历一遍,给每一层都打上一个标签表示当前层次,后来发现还不如法一简单呢,然后就放弃了,但是看到题解里面有人用,于是我就去学习了一下,看到使用的c++,然后看到了一个level+1,我突然想到了中序遍历的递归时候可以传进来一个level,然后下一层就加一就好了,我就又去写了一遍递归的做法
class Solution {
//递归
Map<Integer,List<Integer>> map = new HashMap<>();
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if (root == null) {
return result;
}
help(root,1);
for(Integer key : map.keySet()) {
result.add(map.get(key));
}
return result;
}
public void help(TreeNode node,Integer level){
if (node==null) {
return ;
}
if (map.containsKey(level)) {
List<Integer> list = map.get(level);
list.add(node.val);
map.put(level,list);
} else {
List<Integer> list = new ArrayList<>();
list.add(node.val);
map.put(level,list);
}
help(node.left,level+1);
help(node.right,level+1);
}
}
嗯,效果还不错哈哈
后来我才发现这个是DFS的应用,真是好玩哈哈