一、题目描述
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
另 后面出现的要求最后返回从底 到顶的 结果形式
二、题解
2.1BFS迭代、
和以往简单的BFS不同,这里要求返回结果的格式,需要处理一下
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if(root == null){
return res;
}
Queue<TreeNode> mq = new LinkedList<>();
mq.offer(root);
while(!mq.isEmpty()){
List<Integer> ml = new ArrayList<>();
int len = mq.size();
for(int i = 1;i<=len;i++){
TreeNode node = mq.poll();
ml.add(node.val);
if(node.left != null){
mq.offer(node.left);
}
if(node.right != null){
mq.offer(node.right);
}
}
res.add(ml);
}
return res;
}
}
对于返回结果的要求,只需要处理将 子list 每次插入到 父list 的 0 位置 即可
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
Queue<TreeNode> mq = new LinkedList<>();
if(root == null){
return res;
}
mq.offer(root);
while(!mq.isEmpty()){
List<Integer> ml = new ArrayList<>();
int len = mq.size();
for(int i = 1;i<=len;i++){
TreeNode node = mq.poll();
ml.add(node.val);
if(node.left != null){
mq.offer(node.left);
}
if(node.right != null){
mq.offer(node.right);
}
}
//这里处理一下要求返回的格式,每次将子List插到 0 位置
res.add(0,ml);
}
return res;
}
}
再贴一下C++的代码
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
auto levelOrder = vector<vector<int>>();
if (!root) {
return levelOrder;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
auto level = vector<int>();
int size = q.size();
for (int i = 0; i < size; ++i) {
auto node = q.front();
q.pop();
level.push_back(node->val);
if (node->left) {
q.push(node->left);
}
if (node->right) {
q.push(node->right);
}
}
levelOrder.push_back(level);
}
reverse(levelOrder.begin(), levelOrder.end());
return levelOrder;
}
};
2.2BFS的使用场景
- BFS模板
void bfs(TreeNode root) {
Queue<TreeNode> queue = new ArrayDeque<>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll(); // Java 的 pop 写作 poll()
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
}
BFS使用场景:
- 层序遍历
- 最短路径
2.3DFS迭代实现层序遍历
- DFS模板
void dfs(TreeNode root) {
if (root == null) {
return;
}
dfs(root.left);
dfs(root.right);
}
DFS同样可以实现层序遍历
每次递归的时候都需要带一个 index(表示当前的层数),也就对应那个田字格子中的第几行,如果当前行对应的 list 不存在,就加入一个空 list 进去。
动态演示如下:
import java.util.*;
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
if(root==null) {
return new ArrayList<List<Integer>>();
}
//用来存放最终结果
List<List<Integer>> res = new ArrayList<List<Integer>>();
dfs(1,root,res);
return res;
}
void dfs(int index,TreeNode root, List<List<Integer>> res) {
//假设res是[ [1],[2,3] ], index是3,就再插入一个空list放到res中
if(res.size()<index) {
res.add(new ArrayList<Integer>());
}
//将当前节点的值加入到res中,index代表当前层,假设index是3,节点值是99
//res是[ [1],[2,3] [4] ],加入后res就变为 [ [1],[2,3] [4,99] ]
res.get(index-1).add(root.val);
//递归的处理左子树,右子树,同时将层数index+1
if(root.left!=null) {
dfs(index+1, root.left, res);
}
if(root.right!=null) {
dfs(index+1, root.right, res);
}
}
}