Skip to content

Commit 152b8b1

Browse files
author
朱睿家
committed
图的深度优先搜索
1 parent 0029342 commit 152b8b1

File tree

3 files changed

+87
-53
lines changed

3 files changed

+87
-53
lines changed

chapter-22/bfs.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// 有向无环图的广度遍历
1+
// 从某个点出发的广度遍历
22
function bfs(G, s) {
33
let SimulationTree = {};
44
let didSearchMap = new Map();

chapter-22/dfs.js

Lines changed: 42 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,5 @@
1-
function Node(key) {
2-
this.key = key || null
3-
this.pre = null
4-
this.next = null
5-
}
6-
7-
let node1 = new Node(1)
8-
let node1_2 = new Node(2)
9-
let node1_2_4 = new Node(4)
10-
let node2 = new Node(2)
11-
let node2_5 = new Node(5)
12-
let node3 = new Node(3)
13-
let node3_6 = new Node(6)
14-
let node3_6_5 = new Node(5)
15-
let node4 = new Node(4)
16-
let node4_2 = new Node(2)
17-
let node5 = new Node(5)
18-
let node5_4 = new Node(4)
19-
let node6 = new Node(6)
20-
let node6_6 = new Node(6)
21-
node1.next = node1_2
22-
node1_2.pre = node1
23-
node1_2.next = node1_2_4
24-
node1_2_4.pre = node1_2
25-
node2.next = node2_5
26-
node2_5.pre = node2
27-
node3.next = node3_6
28-
node3_6.pre = node3
29-
node3_6.next = node3_6_5
30-
node3_6_5.pre = node3_6
31-
node4.next = node4_2
32-
node4_2.pre = node4
33-
node5.next = node5_4
34-
node5_4.pre = node5
35-
node6.next = node6_6
36-
node6_6.pre = node6
37-
38-
const G = [node1, node2, node3, node4, node5, node6]
391

2+
// 从某个点出发的深度遍历
403
function dfs(G, s) {
414

425
function getStartNodeIndex(P, a) {
@@ -47,29 +10,56 @@ function dfs(G, s) {
4710
let SimulationTree = {};
4811
let didSearchMap = new Map();
4912

50-
function search(startNode,SimulationTree){
13+
function findNext(inputNode) {
14+
let resultNode;
15+
function nextEdgeNode(node) {
16+
if (node.next === null) {
17+
resultNode = null
18+
} else if (didSearchMap[node.next.key] === 1) {
19+
nextEdgeNode(node.next)
20+
} else {
21+
resultNode = node.next
22+
}
23+
}
24+
nextEdgeNode(inputNode)
25+
return resultNode
26+
}
27+
28+
function search(startNode, SimulationTree) {
5129
let stack = [];
5230
function searchDeep(node, tree) {
53-
tree[node.key] = new Object({})
54-
stack.push(node.next);
55-
didSearchMap[node.key] = 1
56-
if (node.next !== null) {
31+
tree[node.key] === undefined ? tree[node.key] = new Object({}) : null;
32+
didSearchMap[node.key] = 1; //记录已经走过的节点
33+
if (node.next === null) { //如果为空返回上一个节点
34+
if (stack.length !== 0) {
35+
let preNode = stack.pop();
36+
let resultNode = findNext(preNode);
37+
if (resultNode) {
38+
let t = G[getStartNodeIndex(G, resultNode.key)]
39+
search(t, tree);
40+
}
41+
}
42+
} else {
5743
let nextNode = G[getStartNodeIndex(G, node.next.key)]
5844
if (!didSearchMap[nextNode.key]) {
59-
searchDeep(nextNode, tree[node.key])
60-
}else{
61-
stack.pop();
62-
search(node,)
45+
stack.push(node); //保存上一个节点
46+
searchDeep(nextNode, tree[node.key]);
47+
} else { // 遇到已经经过的节点 返回上一个节点 查找是否有其他路径
48+
if (stack.length !== 0) {
49+
let preNode = stack.pop(); // 找回上一个节点
50+
let resultNode = findNext(preNode); // 去邻接链表中查询对应没有经过的节点
51+
if (resultNode) {
52+
let t = G[getStartNodeIndex(G, resultNode.key)]
53+
search(t, tree);
54+
}
55+
}
6356
}
64-
}else{
65-
6657
}
6758
}
6859
searchDeep(startNode, SimulationTree);
6960
}
70-
search(startNode,SimulationTree)
61+
search(startNode, SimulationTree)
7162
return SimulationTree
7263
}
7364

74-
// dfs(G, 1)
75-
console.log(JSON.stringify(dfs(G, 1)))
65+
module.exports = dfs;

test/dfs.test.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
function Node(key) {
2+
this.key = key || null
3+
this.pre = null
4+
this.next = null
5+
}
6+
7+
let node1 = new Node(1)
8+
let node1_2 = new Node(2)
9+
let node1_2_4 = new Node(4)
10+
let node2 = new Node(2)
11+
let node2_5 = new Node(5)
12+
let node3 = new Node(3)
13+
let node3_6 = new Node(6)
14+
let node3_6_5 = new Node(5)
15+
let node4 = new Node(4)
16+
let node4_2 = new Node(2)
17+
let node5 = new Node(5)
18+
let node5_4 = new Node(4)
19+
let node6 = new Node(6)
20+
let node6_6 = new Node(6)
21+
node1.next = node1_2
22+
node1_2.pre = node1
23+
node1_2.next = node1_2_4
24+
node1_2_4.pre = node1_2
25+
node2.next = node2_5
26+
node2_5.pre = node2
27+
node3.next = node3_6
28+
node3_6.pre = node3
29+
node3_6.next = node3_6_5
30+
node3_6_5.pre = node3_6
31+
node4.next = node4_2
32+
node4_2.pre = node4
33+
node5.next = node5_4
34+
node5_4.pre = node5
35+
node6.next = node6_6
36+
node6_6.pre = node6
37+
38+
const G = [node1, node2, node3, node4, node5, node6]
39+
40+
const dfs = require('../chapter-22/dfs');
41+
42+
test('邻接链矩阵的深度搜索',()=>{
43+
expect(dfs(G,3)).toEqual({"3":{"6":{},"5":{"4":{"2":{}}}}})
44+
})

0 commit comments

Comments
 (0)