理解算法原理和上手操作是两回事啊,做到树的层次遍历的题目有关BFS的知识和模板用自己的语言总结一下。做的题目还不够多,欢迎大佬们的建议和讨论~
BFS:广度优先搜索(Breadth First Search)
从一个可能的节点出发,搜索每个与其直接相连的节点,以同样的方式对相连的节点进行迭代从而遍历所有节点。
数据结构:队列
DFS:深度优先搜索(Depth First Search)
从一个可能的节点出发,沿着其中一条相邻的边直到无路可走,以同样的方式迭代每一条相邻的边从而遍历所有节点。
数据结构:栈
BFS java 自我总结套路
只是现阶段自己总结的套路,具体问题还要具体分析。
//1. 建立队列并将起始节点放入队列中
Queue<Class> q = new LinkedList<>();
q.offer(first_node);
//2. BFS
while(!q.isEmpty()) { //*
Node curr = q.poll(); //*
process(curr);// 对curr做题目要求的事
if (adjacent_list != null) { //curr有相邻的节点时
for (Node node: adjacent_list) { // 在所有相邻节点(adjacent_list)中搜索
q.offer(node); //*
}
}
}
leetcode 429 (self-report题解)
3 ms 42.1 MB
class Solution {
public List<List<Integer>> levelOrder(Node root) {
List<List<Integer>> result = new ArrayList<>(); //result
if (root != null) {
Queue<List<Node>> q = new LinkedList<>(); //*
List<Node> root_list = new ArrayList<Node>();
root_list.add(root);
q.offer(root_list);
while (!q.isEmpty()) { //*
// iteration
List<Node> curr_layer = q.poll(); //*
List<Node> next_layer = new ArrayList<Node>();
// process
List<Integer> layer = new ArrayList<Integer>();
for (Node node: curr_layer) {
// process
layer.add(node.val);
// iteration
if (node.children != null) {
for (Node child: node.children) {
next_layer.add(child);
}
}
}
// process
if (layer.size() > 0) {
result.add(layer);
}
// 因为需要体现出层次遍历,所以在之前总结的基础上还要实现分层,即在循环外将整个一层加入队列。
if (next_layer.size() > 0) {
q.offer(next_layer); //*
}
}
}
return result; //result
}
}