看到关于bfs、dfs得题目二话不说先把模板写上去,在尝试去加题目条件。
二叉树
bfs---------- 队列
dfs---------- 栈
BFS(广度优先遍历)
使用队列Queue实现bfs
//使用Queue实现BFS
public void BFSWithQueue(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
if (root == null) return null;
queue.add(root);
while (!queue.isEmpty()) {
TreeNode treeNode = queue.poll();
//在这里处理遍历到的TreeNode节点
if (treeNode.left != null)
queue.add(treeNode.left);
if (treeNode.right != null)
queue.add(treeNode.right);
}
}
DFS(深度优先遍历)
使用栈Stack来实现dfs
//DFS的迭代实现版本(Stack)
public void DFSWithStack(TreeNode root) {
if (root == null)
return;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode treeNode = stack.pop();
//在这里处理遍历到的TreeNode
if (treeNode.right != null)
stack.push(treeNode.right);
if (treeNode.left != null)
stack.push(treeNode.left);
}
}
图
BFS
需要设置一个Set,看子节点是否被访问过
//使用Queue实现BFS
public void BFSWithQueue(Node root) {
Queue<Node> queue = new LinkedList<>();
if (root != null)
queue.add(root);
Set<Node> visited = new HashSet<>();
while (!queue.isEmpty()) {
Node node = queue.poll();
visited.add(node);
//在这里处理遍历到的Node节点
if (node.children != null) {
for (Node child : node.children) {
if (child != null && !visited.contains(child){
queue.add(child);
}
}
}
}
}