go 递归无限极分类

本文介绍如何使用Go语言实现递归算法,创建一个无限极分类树,展示如何将给定的数据结构转换为JSON格式的树状图,适用于组织和展示层级关系的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

递归无限极分类

package main

import (
	"encoding/json"
	"io/ioutil"
	"log"
)

type list struct {
	ID int
	Name string
	TopObj  *list
	Pid int
	Child []list
}

func handel(tree *list, v list){
	if v.Pid == 0 {
		v.TopObj = &list{
			Name : tree.Name,
		}
		tree.Child = append(tree.Child, v)
	}else{
		if len(tree.Child) > 0 {
			for key, value := range tree.Child {
				if value.ID == v.Pid {
					v.TopObj = &list{
						Name:   value.Name,
					}
					tree.Child[key].Child = append(tree.Child[key].Child, v)
				}else{
					handel(&tree.Child[key], v)
				}
			}
		}
	}
}

func main() {
	a := []list{
		{
			ID:1,
			Name:"A",
			Pid:0,
		},
		{
			ID:10,
			Name:"Q",
			Pid:0,
		},
		{
			ID:2,
			Name:"b",
			Pid:1,
		},
		{
			ID:3,
			Name:"c",
			Pid:0,
		},
		{
			ID:4,
			Name:"d",
			Pid:3,
		},
		{
			ID:11,
			Name:"aa",
			Pid:0,
		},
		{
			ID:5,
			Name:"E",
			Pid:4,
		},
		{
			ID:12,
			Name:"BB",
			Pid:11,
		},
		{
			ID:13,
			Name:"CC",
			Pid:12,
		},
		{
			ID:14,
			Name:"DD",
			Pid:13,
		},
	}
	root := &list{
		ID:    0,
		Name: "/",
	}
	for _,v  := range a {
		handel(root, v)
	}

	jsonStr, err :=json.MarshalIndent(root," ","\t")
	if err != nil {
		log.Fatalln(err)
	}

	if err := ioutil.WriteFile("./tree.json", jsonStr, 0644); err != nil {
		log.Fatalln(err)
	}

}

生成树状图

tree.json

{
 	"ID": 0,
 	"Name": "/",
 	"TopObj": null,
 	"Pid": 0,
 	"Child": [
 		{
 			"ID": 1,
 			"Name": "A",
 			"TopObj": {
 				"ID": 0,
 				"Name": "/",
 				"TopObj": null,
 				"Pid": 0,
 				"Child": null
 			},
 			"Pid": 0,
 			"Child": [
 				{
 					"ID": 2,
 					"Name": "b",
 					"TopObj": {
 						"ID": 0,
 						"Name": "A",
 						"TopObj": null,
 						"Pid": 0,
 						"Child": null
 					},
 					"Pid": 1,
 					"Child": null
 				}
 			]
 		},
 		{
 			"ID": 10,
 			"Name": "Q",
 			"TopObj": {
 				"ID": 0,
 				"Name": "/",
 				"TopObj": null,
 				"Pid": 0,
 				"Child": null
 			},
 			"Pid": 0,
 			"Child": null
 		},
 		{
 			"ID": 3,
 			"Name": "c",
 			"TopObj": {
 				"ID": 0,
 				"Name": "/",
 				"TopObj": null,
 				"Pid": 0,
 				"Child": null
 			},
 			"Pid": 0,
 			"Child": [
 				{
 					"ID": 4,
 					"Name": "d",
 					"TopObj": {
 						"ID": 0,
 						"Name": "c",
 						"TopObj": null,
 						"Pid": 0,
 						"Child": null
 					},
 					"Pid": 3,
 					"Child": [
 						{
 							"ID": 5,
 							"Name": "E",
 							"TopObj": {
 								"ID": 0,
 								"Name": "d",
 								"TopObj": null,
 								"Pid": 0,
 								"Child": null
 							},
 							"Pid": 4,
 							"Child": null
 						}
 					]
 				}
 			]
 		},
 		{
 			"ID": 11,
 			"Name": "aa",
 			"TopObj": {
 				"ID": 0,
 				"Name": "/",
 				"TopObj": null,
 				"Pid": 0,
 				"Child": null
 			},
 			"Pid": 0,
 			"Child": [
 				{
 					"ID": 12,
 					"Name": "BB",
 					"TopObj": {
 						"ID": 0,
 						"Name": "aa",
 						"TopObj": null,
 						"Pid": 0,
 						"Child": null
 					},
 					"Pid": 11,
 					"Child": [
 						{
 							"ID": 13,
 							"Name": "CC",
 							"TopObj": {
 								"ID": 0,
 								"Name": "BB",
 								"TopObj": null,
 								"Pid": 0,
 								"Child": null
 							},
 							"Pid": 12,
 							"Child": [
 								{
 									"ID": 14,
 									"Name": "DD",
 									"TopObj": {
 										"ID": 0,
 										"Name": "CC",
 										"TopObj": null,
 										"Pid": 0,
 										"Child": null
 									},
 									"Pid": 13,
 									"Child": null
 								}
 							]
 						}
 					]
 				}
 			]
 		}
 	]
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值