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+ // 从某个点出发的深度遍历
403function 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 ;
0 commit comments