-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathGraphVertex.js
More file actions
128 lines (125 loc) · 2.75 KB
/
GraphVertex.js
File metadata and controls
128 lines (125 loc) · 2.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import LinkedList from '../linked-list/LinkedList'
export default class GraphVertex {
/**
* 图的顶点
* @param {*} value
*/
constructor(value) {
if (value === undefined) {
throw new Error('Graph vertex must have a value')
}
/**
* @param {GraphEdge} edgeA
* @param {GraphEdge} edgeB
*/
const edgeComparator = (edgeA, edgeB) => {
if (edgeA.getKey() === edgeB.getKey()) {
return 0
}
return edgeA.getKey() < edgeB.getKey() ? -1 : 1
}
// 顶点的值
this.value = value
// 邻接表,保存边节点
this.edges = new LinkedList(edgeComparator)
}
/**
* 保存边节点
* @param {GraphEdge} edge
*/
addEdge(edge) {
this.edges.append(edge)
return this
}
/**
* 删除边节点
* @param {GraphEdge} edge
*/
deleteEdge(edge) {
this.edges.delete(edge)
}
/**
* 是否为某条边的顶点
* @param {GraphEdge} requiredEdge
* @returns {boolean}
*/
hasEdge(requiredEdge) {
const edgeNode = this.edges.find({
callback: edge => edge === requiredEdge
})
return !!edgeNode
}
/**
* 找到与某个顶点的边
* @param {GraphVertex} vertex
* @returns {GraphEdge|null}
*/
findEdge(vertex) {
const edgeFinder = edge => {
return edge.startVertex === vertex || edge.endVertex === vertex
}
const edge = this.edges.find({
callback: edgeFinder
})
return edge ? edge.value : null
}
/**
* 获取顶点所有的边
* @returns{GraphEdge[]}
*/
getEdges() {
return this.edges.toArray().map(linkedListNode => linkedListNode.value)
}
/**
* 删除顶点所有的边
* @returns {GraphVertex}
*/
deleteAllEdges() {
this.getEdges().forEach(edge => this.deleteEdge(edge))
return this
}
/**
* 获取所有与顶点相连的点
* @returns {GraphVertex[]}
*/
getNeighbors() {
const edges = this.edges.toArray()
const neighborsConverter = node => {
return node.value.startVertex === this
? node.value.endVertex
: node.value.startVertex
}
return edges.map(neighborsConverter)
}
/**
* 是否与某个顶点相连
* @param {GraphVertex} vertex
* @returns {boolean}
*/
hasNeighbor(vertex) {
const vertexNode = this.edges.find({
callback: edge => edge.startVertex === vertex || edge.endVertex === vertex
})
return !!vertexNode
}
/**
* 获取顶点的度(有向图的入度)
* @returns {number}
*/
getDegree() {
return this.edges.toArray().length
}
/**
* 获取顶点的值
*/
getKey() {
return this.value
}
/**
* @param {functtion} callback
* @returns {string}
*/
toString(callback) {
return callback ? callback(this.value) : `${this.value}`
}
}