Golang树形结构(实现菜单树)

1、方法一:递归

1.1、思路

树函数(列表,父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"`
}

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},
		{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"`
}
 
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},
        {6, 0, "未分配", nil},
}
    res := getTreeIterative(list, 0)
    bytes, _ := json.MarshalIndent(res, "", "    ")
    fmt.Printf("%s\n", bytes)
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Golang中的哈夫曼编码是一种数据压缩算法,适用于将大数据量进行高效的压缩和解压缩操作。哈夫曼编码的原理是根据字符出现的频率构建一棵,出现频率较高的字符使用较短的编码,出现频率较低的字符使用较长的编码,从而实现数据的压缩。 在Golang中,可以使用哈夫曼编码库来实现这一算法。首先,需要统计字符的出现频率,可以通过遍历待压缩的数据来进行统计。然后,根据字符的频率构建哈夫曼,可以使用优先队列或堆来实现。 一旦构建好了哈夫曼,就可以生成每个字符对应的哈夫曼编码。编码过程中,从根节点开始,遍历的路径,当遇到左子时将路径上加入0,遇到右子时加入1,直到到达叶子节点,将路径上的编码记录下来。最终,每个字符对应的哈夫曼编码就是根据路径上的0和1组成的。 对于压缩数据,在编码时将每个字符替换成对应的哈夫曼编码,将压缩后的编码写入到新的文件中。对于解压缩数据,需要读取压缩文件中的编码,根据哈夫曼的结构进行逐个字符的解码操作。 总而言之,Golang中的哈夫曼编码是一种高效的数据压缩算法,通过统计字符出现的频率构建哈夫曼,然后生成每个字符对应的哈夫曼编码,从而实现数据的压缩和解压缩操作。通过使用相关的库,可以方便地实现这一算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值