1.工具类:队列和字典
export class DictionNary { constructor ( ) { this . items = { } } set ( key, value) { this . items[ key] = value} has ( key ) { return this . items. hasOwnProperty ( key) } get ( key) { return this . has ( key) ? this . items[ key] : undefined } remove ( key ) { if ( this . has ( key) ) { delete this . items[ key] return true } return false } keys ( ) { return Object. keys ( this . items) } values ( ) { return Object} size ( ) { return this . keys ( ) . length} clear ( ) { this . items = { } } toString ( ) { if ( this . size ( ) > 0 ) { let objString = ` { ${ this . keys ( ) . join ( ',' ) } } ` return objString} else { return '{}' } }
} export class Queue { constructor ( ) { this . items = [ ] } enqueue ( element ) { this . items. push ( element) } dequeue ( ) { return this . items. shift ( ) } front ( ) { return this . items[ 0 ] } isEmpty ( ) { return this . items. length == 0 } size ( ) { return this . items. length} toString ( ) { return this . items. toString ( ) } }
2. 图的封装
class Graph { constructor ( ) { this . vertexes = [ ] this . edges = new DictionNary ( ) } addVertex ( v ) { this . vertexes. push ( v) this . edges. set ( v, [ ] ) } addEdge ( v1, v2 ) { this . edges. get ( v1) . push ( v2) this . edges. get ( v2) . push ( v1) } toString ( ) { let result = '' for ( let i = 0 ; i < this . vertexes. length; i++ ) { result += this . vertexes[ i] + ' -> ' const neighbors = this . edges. get ( this . vertexes[ i] ) for ( let j = 0 ; j < neighbors. length; j++ ) { result += neighbors[ j] + ' ' } result += '\n' } return result} initializeColor ( ) { const colors = [ ] for ( let i = 0 ; i < this . vertexes. length; i++ ) { colors[ this . vertexes[ i] ] = 'white' } return colors} bfs ( firstVertex, callback ) { const colors = this . initializeColor ( ) const queue = new Queue ( ) queue. enqueue ( firstVertex) while ( ! queue. isEmpty ( ) ) { const v = queue. dequeue ( ) const neighbors = this . edges. get ( v) colors[ v] = 'gray' for ( let i = 0 ; i < neighbors. length; i++ ) { const w = neighbors[ i] if ( colors[ w] === 'white' ) { colors[ w] = 'gray' queue. enqueue ( w) } } colors[ v] = 'black' callback ( v) } } dfs ( initVertex, callback ) { const colors = this . initializeColor ( ) this . dfsVisit ( initVertex, colors, callback) } dfsVisit ( vertexes, colors, callback ) { colors[ vertexes] = 'gray' callback ( vertexes) const neighbors = this . edges. get ( vertexes) for ( let i = 0 ; i < neighbors. length; i++ ) { const w = neighbors[ i] if ( colors[ w] === 'white' ) { this . dfsVisit ( w, colors, callback) } } colors[ vertexes] = 'black' } }
图测试用例
const graph = new Graph ( ) const myVertices = [ 'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , 'I' ] for ( let i = 0 ; i < myVertices. length; i++ ) { graph. addVertex ( myVertices[ i] ) } graph. addEdge ( 'A' , 'B' ) graph. addEdge ( 'A' , 'C' ) graph. addEdge ( 'A' , 'D' ) graph. addEdge ( 'C' , 'D' ) graph. addEdge ( 'C' , 'G' ) graph. addEdge ( 'D' , 'G' ) graph. addEdge ( 'D' , 'H' ) graph. addEdge ( 'B' , 'E' ) graph. addEdge ( 'B' , 'F' ) graph. addEdge ( 'E' , 'I' ) console. log ( graph. toString ( ) ) let result = '' graph. bfs ( graph. vertexes[ 0 ] , function ( v ) { result += v + ' ' } ) console. log ( result) let deepRsult = '' graph. dfs ( graph. vertexes[ 0 ] , function ( v ) { deepRsult += v + ' ' } ) console. log ( deepRsult)