@@ -84,75 +84,130 @@ func (o *TreeNode) toRawString() string {
84
84
return sb .String ()
85
85
}
86
86
87
- func ( o * TreeNode ) CountNodes () int {
88
- cnto := 0
89
- var _f func (o * TreeNode )
90
- _f = func (o * TreeNode ) {
87
+ func GetParents ( root * TreeNode ) map [ * TreeNode ] * TreeNode {
88
+ parents := map [ * TreeNode ] * TreeNode {}
89
+ var dfs func (o , pa * TreeNode )
90
+ dfs = func (o , pa * TreeNode ) {
91
91
if o == nil {
92
92
return
93
93
}
94
- cnto ++
95
- _f (o .Left )
96
- _f (o .Right )
94
+ parents [ o ] = pa
95
+ dfs (o .Left , o )
96
+ dfs (o .Right , o )
97
97
}
98
- _f (o )
99
- return cnto
98
+ dfs (root , nil )
99
+ return parents
100
+ }
101
+
102
+ func CountNodes (root * TreeNode ) (cnt int ) {
103
+ var dfs func (* TreeNode )
104
+ dfs = func (o * TreeNode ) {
105
+ if o == nil {
106
+ return
107
+ }
108
+ cnt ++
109
+ dfs (o .Left )
110
+ dfs (o .Right )
111
+ }
112
+ dfs (root )
113
+ return
100
114
}
101
115
102
116
// 加权图见下面的 ToWeightedGraph
103
- func ( o * TreeNode ) ToGraph () {
104
- n := o . CountNodes ()
117
+ func ToGraph ( root * TreeNode ) [][] int {
118
+ n := CountNodes (root )
105
119
g := make ([][]int , n )
106
- cnt := 0
120
+ id := 0
121
+ var build func (* TreeNode )
122
+ build = func (o * TreeNode ) {
123
+ v := id
124
+ if o .Left == nil && o .Right == nil {
125
+ // do leaf ...
126
+
127
+ }
128
+ if o .Left != nil {
129
+ id ++
130
+ g [v ] = append (g [v ], id )
131
+ g [id ] = append (g [id ], v )
132
+ build (o .Left )
133
+ }
134
+ if o .Right != nil {
135
+ id ++
136
+ g [v ] = append (g [v ], id )
137
+ g [id ] = append (g [id ], v )
138
+ build (o .Right )
139
+ }
140
+ }
141
+ build (root )
142
+ return g
143
+ }
144
+
145
+ type DirEdge struct {
146
+ to int
147
+ dir byte
148
+ }
149
+
150
+ func ToGraphWithDir (root * TreeNode ) [][]DirEdge {
151
+ const (
152
+ left = 'L'
153
+ right = 'R'
154
+ up = 'U'
155
+ )
156
+ n := CountNodes (root )
157
+ g := make ([][]DirEdge , n )
158
+ id := 0
107
159
var build func (o * TreeNode )
108
160
build = func (o * TreeNode ) {
109
- v := cnt
161
+ v := id
110
162
if o .Left == nil && o .Right == nil {
111
163
// do leaf ...
112
164
113
165
}
114
166
if o .Left != nil {
115
- cnt ++
116
- g [v ] = append (g [v ], cnt )
117
- g [cnt ] = append (g [cnt ], v )
167
+ id ++
168
+ g [v ] = append (g [v ], DirEdge { id , left } )
169
+ g [id ] = append (g [id ], DirEdge { v , up } )
118
170
build (o .Left )
119
171
}
120
172
if o .Right != nil {
121
- cnt ++
122
- g [v ] = append (g [v ], cnt )
123
- g [cnt ] = append (g [cnt ], v )
173
+ id ++
174
+ g [v ] = append (g [v ], DirEdge { id , right } )
175
+ g [id ] = append (g [id ], DirEdge { v , up } )
124
176
build (o .Right )
125
177
}
126
178
}
127
- build (o )
179
+ build (root )
180
+ return g
128
181
}
129
182
130
- func (o * TreeNode ) ToWeightedGraph () {
131
- type edge struct { to , weight int }
132
- n := o .CountNodes ()
133
- g := make ([][]edge , n )
134
- cnt := 0
183
+ type Edge struct { to , wt int }
184
+
185
+ func ToWeightedGraph (root * TreeNode ) [][]Edge {
186
+ n := CountNodes (root )
187
+ g := make ([][]Edge , n )
188
+ id := 0
135
189
var build func (o * TreeNode )
136
190
build = func (o * TreeNode ) {
137
- v := cnt
191
+ v := id
138
192
if o .Left == nil && o .Right == nil {
139
193
// do leaf ...
140
194
141
195
}
142
196
if o .Left != nil {
143
- cnt ++
144
- g [v ] = append (g [v ], edge { cnt , o .Left .Val })
145
- g [cnt ] = append (g [cnt ], edge {v , o .Left .Val })
197
+ id ++
198
+ g [v ] = append (g [v ], Edge { id , o .Left .Val })
199
+ g [id ] = append (g [id ], Edge {v , o .Left .Val })
146
200
build (o .Left )
147
201
}
148
202
if o .Right != nil {
149
- cnt ++
150
- g [v ] = append (g [v ], edge { cnt , o .Right .Val })
151
- g [cnt ] = append (g [cnt ], edge {v , o .Right .Val })
203
+ id ++
204
+ g [v ] = append (g [v ], Edge { id , o .Right .Val })
205
+ g [id ] = append (g [id ], Edge {v , o .Right .Val })
152
206
build (o .Right )
153
207
}
154
208
}
155
- build (o )
209
+ build (root )
210
+ return g
156
211
}
157
212
158
213
//
@@ -205,22 +260,40 @@ func (o *ListNode) toRawString() string {
205
260
return sb .String ()
206
261
}
207
262
208
- func (o * ListNode ) Values () []int {
209
- vals := []int {}
210
- for ; o != nil ; o = o .Next {
211
- vals = append (vals , o .Val )
212
- }
213
- return vals
214
- }
215
-
216
- func (o * ListNode ) Nodes () []* ListNode {
263
+ func Nodes (head * ListNode ) []* ListNode {
217
264
nodes := []* ListNode {}
218
- for ; o != nil ; o = o .Next {
265
+ for o := head ; o != nil ; o = o .Next {
219
266
nodes = append (nodes , o )
220
267
}
221
268
return nodes
222
269
}
223
270
271
+ func Values (head * ListNode ) (values []int ) {
272
+ for o := head ; o != nil ; o = o .Next {
273
+ values = append (values , o .Val )
274
+ }
275
+ return values
276
+ }
277
+
278
+ func BuildListNodeFromInts (a []int ) * ListNode {
279
+ if len (a ) == 0 {
280
+ return nil
281
+ }
282
+ head := & ListNode {Val : a [0 ]}
283
+ cur := head
284
+ for _ , v := range a [1 :] {
285
+ cur .Next = & ListNode {Val : v }
286
+ cur = cur .Next
287
+ }
288
+ return head
289
+ }
290
+
291
+ func ModifyNodes (head * ListNode , f func ([]int ) []int ) * ListNode {
292
+ a := Values (head )
293
+ res := f (a )
294
+ return BuildListNodeFromInts (res )
295
+ }
296
+
224
297
//
225
298
226
299
func MustBuildTreeNode (rawArray string ) * TreeNode {
0 commit comments