图,和二叉树类似,只不过二叉树严格一个入点,2个出点。而图则不限制
宽度优先遍历
1.利用队列来实现
2.将源节点依次按照宽度进队列,然后弹出
3.每弹出一个结点,就该节点的多有邻接节点放进队列
4.不断
private void bfs(Node node){
if (null == node){
return;
}
LinkedList<Node> queue = new LinkedList<>();
HashSet<Node> set = new HashSet<>();
queue.add(node);
set.add(node);
while (!queue.isEmpty()){
Node poll = queue.poll();
System.out.println(poll.value);
//将节点邻近的没有遍历过的节点全部入队列
for (Node next : poll.nexts) {
if (!set.contains(next)){
queue.add(next);
set.add(next);
}
}
}
}
深度遍历
利用栈实现,将源节点按照深度入栈,然后弹出,每弹出一个结点,把该节点的下一个没有入过栈的邻节点放入栈,直到栈变空
private void dfs(Node node){
Stack<Node> stack = new Stack<>();
HashSet<Node> set = new HashSet<>();
stack.push(node);
set.add(node);
System.out.println(node.value);
while (!stack.isEmpty()){
Node pop = stack.pop();
for (Node next : pop.nexts) {
if (!set.contains(next)){
stack.push(pop);
stack.push(next);
set.add(next);
System.out.println(next.value);
break;
}
}
}
}
测试代码
public class Node {
public int value;
public int in;
public int out;
public ArrayList<Node> nexts;
public ArrayList<Edge> edges;
public Node(int value) {
this.value = value;
in = 0;
out = 0;
nexts = new ArrayList<>();
edges = new ArrayList<>();
}
}
public class BFS {
private static void bfs(Node node){
if (null == node){
return;
}
LinkedList<Node> queue = new LinkedList<>();
HashSet<Node> set = new HashSet<>();
queue.add(node);
set.add(node);
while (!queue.isEmpty()){
Node poll = queue.poll();
System.out.println(poll.value);
//将节点邻近的没有遍历过的节点全部入队列
for (Node next : poll.nexts) {
if (!set.contains(next)){
queue.add(next);
set.add(next);
}
}
}
}
public static void main(String[] args) {
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node3 = new Node(3);
Node node4 = new Node(4);
Node node5 = new Node(5);
Node node6 = new Node(6);
ArrayList<Node> list1 = new ArrayList<>();
list1.add(node2);
list1.add(node4);
list1.add(node6);
node1.nexts = list1;
ArrayList<Node> list2 = new ArrayList<>();
list2.add(node1);
list2.add(node3);
list2.add(node4);
list2.add(node5);
node2.nexts = list2;
ArrayList<Node> list3 = new ArrayList<>();
list3.add(node2);
list3.add(node4);
node3.nexts = list3;
ArrayList<Node> list4 = new ArrayList<>();
list4.add(node1);
list4.add(node2);
list4.add(node3);
node4.nexts = list4;
ArrayList<Node> list5 = new ArrayList<>();
list5.add(node2);
list5.add(node6);
node5.nexts = list5;
ArrayList<Node> list6 = new ArrayList<>();
list6.add(node1);
list6.add(node5);
node6.nexts = list6;
bfs(node1);
}
}
public class DFS {
private static void dfs(Node node){
Stack<Node> stack = new Stack<>();
HashSet<Node> set = new HashSet<>();
stack.push(node);
set.add(node);
System.out.println(node.value);
while (!stack.isEmpty()){
Node pop = stack.pop();
for (Node next : pop.nexts) {
if (!set.contains(next)){
stack.push(pop);
stack.push(next);
set.add(next);
System.out.println(next.value);
break;
}
}
}
}
public static void main(String[] args) {
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node3 = new Node(3);
Node node4 = new Node(4);
Node node5 = new Node(5);
Node node6 = new Node(6);
ArrayList<Node> list1 = new ArrayList<>();
list1.add(node2);
list1.add(node4);
list1.add(node6);
node1.nexts = list1;
ArrayList<Node> list2 = new ArrayList<>();
list2.add(node1);
list2.add(node3);
list2.add(node4);
list2.add(node5);
node2.nexts = list2;
ArrayList<Node> list3 = new ArrayList<>();
list3.add(node2);
list3.add(node4);
node3.nexts = list3;
ArrayList<Node> list4 = new ArrayList<>();
list4.add(node1);
list4.add(node2);
list4.add(node3);
node4.nexts = list4;
ArrayList<Node> list5 = new ArrayList<>();
list5.add(node2);
list5.add(node6);
node5.nexts = list5;
ArrayList<Node> list6 = new ArrayList<>();
list6.add(node1);
list6.add(node5);
node6.nexts = list6;
dfs(node1);
}
}