golang 将扁平的数据转为树形结构 O(n)级算法
小结:
1、借助指针,2个循环搞定;
2、支持无限层级的树状结构。
type T struct {
domain.VOGoodsCat
Children []*T
}
flat := func() []domain.VOGoodsCat {
flat := []domain.VOGoodsCat{}
for _, v := range out.List {
u := domain.VOGoodsCat{}
u.ParentId = v.ParentId
u.CategoryId = v.CategoryId
u.ParentId = v.ParentId
u.Name = v.Name
flat = append(flat, u)
}
return flat
}()
treeList := func() []T {
// TODO 族谱树 多叉树
treeList := []T{}
flatPtr := []T{}
for _, i := range flat {
t := T{}
t.CategoryId = i.CategoryId
t.ParentId = i.ParentId
t.Name = i.Name
t.Children = []*T{}
flatPtr = append(flatPtr, t)
}
for m := range flatPtr {
for n := range flatPtr {
if flatPtr[m].CategoryId == flatPtr[n].ParentId {
flatPtr[m].Children = append(flatPtr[m].Children, &flatPtr[n])
}
}
}
for _, j := range flatPtr {
if j.ParentId == -1 {
treeList = append(treeList, j)
}
}
return treeList
}()