一、内容
1、BFS
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public List<List<Integer>> BFS(TreeNode root) {
List<List<Integer>> allResults = new ArrayList<>();
if (root == null) return allResults;
Queue<TreeNode> nodes = new LinkedList<>();
nodes.add(root);
while (!nodes.isEmpty()) {
int levelSize = nodes.size();
List<Integer> results = new ArrayList<>();
for (int i = 0; i < levelSize; i++) {
TreeNode currNode = nodes.poll();
results.add(currNode.val);
if (currNode.left != null) nodes.add(currNode.left);
if (currNode.right != null) nodes.add(currNode.right);
}
allResults.add(results);
}
return allResults;
}
拓展:双向BFS (面试一般不要求)
public int doubleBFS(ElementType start, ElementType end) {
if (start == end) return 1;
# 分别从起点和终点开始的两个BFS队列
Queue<TreeNode> startQueue = new LinkedList<>();
Queue<TreeNode> endQueue = new LinkedList<>();
startQueue.add(start);
endQueue.add(end);
# 从起点开始和从终点开始分别访问过的节点集合.有时候startQueue与startVisited只需要一个,或者二合一
Set<ElementType> startVisited = new HashSet<>();
Set<ElementType> endVisited = new HashSet<>();
startVisited.add(start)
endVisited.add(end)
Queue<ElementType> tempQueue = new LinkedList<>();
Set<ElementType> tempVisited = new HashSet<>