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
	}()