If I have a flat array of EmployeeNode structs each with a ReportTo field, how do I create a tree-like structure where the root of the tree is represented by an EmployeeNode struct, and the Children field contains a list of EmployeeNodes that report to the root node? For example, given the input below, how do I convert to the root EmployeeNode struct?
type EmployeeNode struct {
UserName string
ReportTo string
Children []EmployeeNode
}
var input []EmployeeNode = [
{
UserName: "Bob Wang",
ReportTo: "",
Children: []EmployeeNode{}
},
{
UserName: "Jim Halpert",
ReportTo: "Bob Wang",
Children: []EmployeeNode{}
},
{
UserName: "Brett Wang",
ReportTo: "Jim Halpert",
Children: []EmployeeNode{}
},
{
UserName: "Ryan Wang",
ReportTo: "Jim Halpert",
Children: []EmployeeNode{},
},
{
UserName: "Michael Wang",
ReportTo: "Bob Wang",
Children: []EmployeeNode{}
},
{
UserName: "Annie Wang",
ReportTo: "Michael Wang",
Children: []EmployeeNode{}
},
{
UserName: "Jay Wang",
ReportTo: "Michael Wang",
Children: []EmployeeNode{}
},
]
// Expected result
var root EmployeeNode = EmployeeNode{
UserName: "Bob Wang",
ReportTo: "",
Children: []EmployeeNode{
EmployeeNode{
UserName: "Jim Halpert",
ReportTo: "Bob Wang",
Children: [
EmployeeNode{
UserName: "Brett Wang",
ReportTo: "Jim Halpert",
Children: []EmployeeNode{},
},
EmployeeNode{
UserName: "Ryan Wang",
ReportTo: "Jim Halpert",
Children: []EmployeeNode{},
},
]
},
EmployeeNode{
UserName: "Michael Wang",
ReportTo: "Bob Wang",
Children: [
EmployeeNode{
UserName: "Annie Wang",
ReportTo: "Michael Wang",
Children: []EmployeeNode{},
},
EmployeeNode{
UserName: "Jay Wang",
ReportTo: "Michael Wang",
Children: []EmployeeNode{},
},
]
},
},
}
Something like this should do you:
func list2tree(employees []EmployeeNode) (root EmployeeNode) {
// a map, to keep track of each individual subtree.
// Using a pointer to the EmployeeInfo struct so as to ensure that there's
// only a single copy of each struct.
subtrees := map[string]*EmployeeNode{}
// populate the map: every node is the root of its own subtree
for _, emp := range employees {
subtrees[emp.ReportTo] = &emp
}
// iterate over the list of employees
for _, emp := range employees {
// if this is not the root node, she reports to somebody
if emp.ReportTo != "" {
// look up their immediate manager
subtree := subtrees[emp.ReportTo]
// add them as a direct report
subtree.Children = append(subtree.Children, emp)
}
}
// At the end of the day, now, the tree is fully populated
// return the root node for the entire tree
return *subtrees[""]
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.