Skip to content

Commit 624e2db

Browse files
committed
添加一些有用的函数
1 parent 07cdaa8 commit 624e2db

File tree

1 file changed

+116
-43
lines changed

1 file changed

+116
-43
lines changed

leetcode/testutil/predefined_type.go

Lines changed: 116 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -84,75 +84,130 @@ func (o *TreeNode) toRawString() string {
8484
return sb.String()
8585
}
8686

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) {
9191
if o == nil {
9292
return
9393
}
94-
cnto++
95-
_f(o.Left)
96-
_f(o.Right)
94+
parents[o] = pa
95+
dfs(o.Left, o)
96+
dfs(o.Right, o)
9797
}
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
100114
}
101115

102116
// 加权图见下面的 ToWeightedGraph
103-
func (o *TreeNode) ToGraph() {
104-
n := o.CountNodes()
117+
func ToGraph(root *TreeNode) [][]int {
118+
n := CountNodes(root)
105119
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
107159
var build func(o *TreeNode)
108160
build = func(o *TreeNode) {
109-
v := cnt
161+
v := id
110162
if o.Left == nil && o.Right == nil {
111163
// do leaf ...
112164

113165
}
114166
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})
118170
build(o.Left)
119171
}
120172
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})
124176
build(o.Right)
125177
}
126178
}
127-
build(o)
179+
build(root)
180+
return g
128181
}
129182

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
135189
var build func(o *TreeNode)
136190
build = func(o *TreeNode) {
137-
v := cnt
191+
v := id
138192
if o.Left == nil && o.Right == nil {
139193
// do leaf ...
140194

141195
}
142196
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})
146200
build(o.Left)
147201
}
148202
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})
152206
build(o.Right)
153207
}
154208
}
155-
build(o)
209+
build(root)
210+
return g
156211
}
157212

158213
//
@@ -205,22 +260,40 @@ func (o *ListNode) toRawString() string {
205260
return sb.String()
206261
}
207262

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 {
217264
nodes := []*ListNode{}
218-
for ; o != nil; o = o.Next {
265+
for o := head; o != nil; o = o.Next {
219266
nodes = append(nodes, o)
220267
}
221268
return nodes
222269
}
223270

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+
224297
//
225298

226299
func MustBuildTreeNode(rawArray string) *TreeNode {

0 commit comments

Comments
 (0)