/
tree-from-image-example.ts
139 lines (122 loc) · 3.29 KB
/
tree-from-image-example.ts
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
129
130
131
132
133
134
135
136
137
138
139
import { DepthFirstTraversal } from '../src/traversals/depth-first-traversal/DepthFirstTraversal';
import { DepthFirstTraversalOrder } from '../src/traversals/depth-first-traversal/lib/DepthFirstTraversalOrder';
/**
* Utils
*/
const RED_FG = '\u001b[31m';
// const RED_BG = '\u001b[41m';
const GREEN_FG = '\u001b[32m';
// const GREEN_BG = '\u001b[42m';
const BLUE_FG = '\u001b[94m';
// const BLUE_BG = '\u001b[104m';
const BLACK_FG = '\u001b[30m';
// const WHITE_FG = '\u001b[97m';
const WHITE_BG = '\u001b[107m';
const RESET = '\u001b[0m';
const ANSI_ESCAPE =
/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;
function getFgColorFor(order: unknown): string {
switch (order) {
case DepthFirstTraversalOrder.PRE_ORDER:
return RED_FG;
case DepthFirstTraversalOrder.IN_ORDER:
return GREEN_FG;
case DepthFirstTraversalOrder.POST_ORDER:
return BLUE_FG;
default:
return '';
}
}
const seq: string[] = [];
function reportVisit(order: DepthFirstTraversalOrder, data: any) {
seq.push([WHITE_BG, getFgColorFor(order), data, BLACK_FG, '-'].join(''));
}
function logWhiteRow(str: string, d = 0): void {
const s = [WHITE_BG, str].join('');
const asciiS = s.replace(ANSI_ESCAPE, '');
console.log(
s,
Array.from({ length: process.stdout.columns - asciiS.length - 1 - d })
.map(() => ' ')
.join(''),
);
}
/**
* Print legend
*/
const LEFT_PADDING = ' ';
logWhiteRow('');
logWhiteRow('');
logWhiteRow('');
logWhiteRow(
[
LEFT_PADDING,
getFgColorFor(DepthFirstTraversalOrder.PRE_ORDER),
'Pre-order'.padEnd(10),
BLACK_FG,
].join(''),
);
logWhiteRow(
[
LEFT_PADDING,
getFgColorFor(DepthFirstTraversalOrder.IN_ORDER),
'In-order'.padEnd(10),
BLACK_FG,
].join(''),
);
logWhiteRow(
[
LEFT_PADDING,
getFgColorFor(DepthFirstTraversalOrder.POST_ORDER),
'Post-order'.padEnd(10),
BLACK_FG,
].join(''),
);
logWhiteRow('');
/**
* Print next command prompt on the next line
*/
process.on('beforeExit', () => {
logWhiteRow([LEFT_PADDING, seq.join('')].join(''));
logWhiteRow('');
logWhiteRow('');
console.log(RESET);
});
/**
* Example (weird formatting to make it compact for README.md)
*/
// @webstorm-formatter:off
// prettier-ignore
const treeData =
{ $d: 'F', $c: [
{ $d: 'B', $c: [
{ $d: 'A', $c: [] },
{ $d: 'D', $c: [
{ $d: 'C', $c: [] },
{ $d: 'E', $c: [] }] }] },
{ $d: 'G', $c: [
null,
{ $d: 'I', $c: [
{ $d: 'H', $c: [] }] }] }] };
const traversal = new DepthFirstTraversal({
traversableTree: {
makeRoot: () => ({ vertexContent: treeData }),
makeVertex: (childHint: any) => ({ vertexContent: childHint }),
},
});
traversal.addVisitorFor(DepthFirstTraversalOrder.PRE_ORDER, (vertex) =>
reportVisit(DepthFirstTraversalOrder.PRE_ORDER, vertex.getData()),
);
traversal.addVisitorFor(DepthFirstTraversalOrder.IN_ORDER, (vertex) =>
reportVisit(DepthFirstTraversalOrder.IN_ORDER, vertex.getData()),
);
traversal.addVisitorFor(DepthFirstTraversalOrder.POST_ORDER, (vertex) =>
reportVisit(DepthFirstTraversalOrder.POST_ORDER, vertex.getData()),
);
traversal.makeRunner().run();
/*
Pre-order
In-order
Post-order
F-B-A-A-A-B-D-C-C-C-D-E-E-E-D-B-F-G-G-I-H-H-H-I-I-G-F-
*/