zoukankan      html  css  js  c++  java
  • golang 树结构化

    最近编写员工分组的组织架构树,记录一下两种方式:

    递归框架

    递归方法优缺点:

      优点:代码较少;

      缺点:性能较差;

    树函数(列表,父ID)
       ret = []
       for 节点 in 列表:
            if 节点的parent_id 等于 父ID
                节点.children = 获取树(列表, 节点ID)
                ret = append(ret,节点)
       return ret
    
    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"`
    }
    
    func getTreeRecursive(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
    }
    
    func main() {
        list := []*Node{
            {4, 3, "ABA", nil},
            {3, 1, "AB", nil},
            {1, 0, "A", nil},
            {2, 1, "AA", nil},
        }
        res := getTreeRecursive(list, 0)
        bytes, _ := json.MarshalIndent(res, "", "    ")
        fmt.Printf("%s
    ", bytes)
    }
    

      

    迭代框架

     本质是创建一条引用链,将所有的节点串起来

    获取树(列表,父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
    
    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"`
    }
    
    func getTreeIterative(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
    
    }
    
    func main() {
        list := []*Node{
            {4, 3, "ABA", nil},
            {3, 1, "AB", nil},
            {1, 0, "A", nil},
            {2, 1, "AA", nil},
            {5, 3, "ABB", nil},
    }
        res := getTreeIterative(list, 0)
        bytes, _ := json.MarshalIndent(res, "", "    ")
        fmt.Printf("%s
    ", bytes)
    }
    

    参考文献

  • 相关阅读:
    【C#进阶系列】06 类型和成员基础
    纪中5日T1 1564. 旅游
    纪中17日T1 2321. 方程
    纪中17日T2 2322. capacitor
    纪中10日T1 2313. 动态仙人掌
    纪中14日听课小结 图论 最短路 二分图 差分约束
    一个抓猫的游戏 消遣GAME 持续更新中!
    洛谷P1464 Function  HDU P1579 Function Run Fun
    洛谷P1976 鸡蛋饼
    纪中12日T1 2307. 选择
  • 原文地址:https://www.cnblogs.com/st12345/p/15396259.html
Copyright © 2011-2022 走看看