树函数(列表,父ID)
ret =[]for 节点 in 列表:if 节点的parent_id 等于 父ID
节点.children = 获取树(列表, 节点ID)
ret =append(ret,节点)return ret
1.2、例子
package main
import("encoding/json""fmt")type Node struct{
Id int`json:"id"`
ParentId int`json:"parent_id"`
Name string`json:"name"`
Children []*Node `json:"children"`}funcgetTreeRecursive(list []*Node, parentId int)[]*Node {
res :=make([]*Node,0)for_, v :=range list {
if v.ParentId == parentId {
v.Children =getTreeRecursive(list, v.Id)
res =append(res, v)}}return res
}funcmain(){
list :=[]*Node{
{
4,3,"ABA",nil},{
3,1,"AB",nil},{
1,0,"A",nil},{
2,1,"AA",nil},{
5,0,"未分配",nil},}
res :=getTreeRecursive(list,0)
bytes,_:= json.MarshalIndent(res,""," ")
fmt.Printf("%s\n", bytes)}
方法2:循环
2.1、思路
获取树(列表,父ID)
memo ={
}for 节点 in 列表://构造memo给节点的父ID查找追加节点用if 节点ID in memo:
节点.children = memo[节点ID].children //之前构造的children数组覆盖当前节点的children
memo[节点ID]= 节点
else
节点.children =[]
memo[节点ID]= 节点
//给像父对象的children追加if 节点父ID in memo:
memo[节点父ID].children.add(memo[节点ID])//追加当前构造的ID节点else:
memo[节点父ID]={
'children':[memo[节点ID]]}//初始化父对象再追加return memo[父ID].children
2.2、例子
package main
import("encoding/json""fmt")type Node struct{
Id int`json:"id"`
ParentId int`json:"parent_id"`
Name string`json:"name"`
Children []*Node `json:"children"`}funcgetTreeIterative(list []*Node, parentId int)[]*Node {
memo :=make(map[int]*Node)for_, v :=range list {
if_, ok := memo[v.Id]; ok {
v.Children = memo[v.Id].Children
memo[v.Id]= v
}else{
v.Children =make([]*Node,0)
memo[v.Id]= v
}if_, ok := memo[v.ParentId]; ok {
memo[v.ParentId].Children =append(memo[v.ParentId].Children, memo[v.Id])}else{
memo[v.ParentId]=&Node{
Children:[]*Node{
memo[v.Id]}}}}return memo[parentId].Children
}funcmain(){
list :=[]*Node{
{
4,3,"ABA",nil},{
3,1,"AB",nil},{
1,0,"A",nil},{
2,1,"AA",nil},{
5,3,"ABB",nil},{
6,0,"未分配",nil},}
res :=getTreeIterative(list,0)
bytes,_:= json.MarshalIndent(res,""," ")
fmt.Printf("%s\n", bytes)}